github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/worker/uniter/runner/context/relation_test.go (about) 1 // Copyright 2012-2014 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package context_test 5 6 import ( 7 "time" 8 9 jc "github.com/juju/testing/checkers" 10 "github.com/juju/utils" 11 gc "gopkg.in/check.v1" 12 "gopkg.in/juju/names.v2" 13 14 "github.com/juju/juju/api" 15 apiuniter "github.com/juju/juju/api/uniter" 16 "github.com/juju/juju/apiserver/params" 17 "github.com/juju/juju/core/relation" 18 "github.com/juju/juju/core/status" 19 "github.com/juju/juju/juju/testing" 20 "github.com/juju/juju/state" 21 "github.com/juju/juju/worker/uniter/runner/context" 22 ) 23 24 type ContextRelationSuite struct { 25 testing.JujuConnSuite 26 app *state.Application 27 rel *state.Relation 28 ru *state.RelationUnit 29 30 st api.Connection 31 uniter *apiuniter.State 32 apiRelUnit *apiuniter.RelationUnit 33 } 34 35 var _ = gc.Suite(&ContextRelationSuite{}) 36 37 func (s *ContextRelationSuite) SetUpTest(c *gc.C) { 38 s.JujuConnSuite.SetUpTest(c) 39 machine, err := s.State.AddMachine("quantal", state.JobHostUnits) 40 c.Assert(err, jc.ErrorIsNil) 41 password, err := utils.RandomPassword() 42 c.Assert(err, jc.ErrorIsNil) 43 err = machine.SetPassword(password) 44 c.Assert(err, jc.ErrorIsNil) 45 err = machine.SetProvisioned("foo", "", "fake_nonce", nil) 46 c.Assert(err, jc.ErrorIsNil) 47 48 ch := s.AddTestingCharm(c, "riak") 49 s.app = s.AddTestingApplication(c, "u", ch) 50 rels, err := s.app.Relations() 51 c.Assert(err, jc.ErrorIsNil) 52 c.Assert(rels, gc.HasLen, 1) 53 s.rel = rels[0] 54 unit, err := s.app.AddUnit(state.AddUnitParams{}) 55 c.Assert(err, jc.ErrorIsNil) 56 err = unit.AssignToMachine(machine) 57 s.ru, err = s.rel.Unit(unit) 58 c.Assert(err, jc.ErrorIsNil) 59 err = s.ru.EnterScope(nil) 60 c.Assert(err, jc.ErrorIsNil) 61 62 password, err = utils.RandomPassword() 63 c.Assert(err, jc.ErrorIsNil) 64 err = unit.SetPassword(password) 65 c.Assert(err, jc.ErrorIsNil) 66 s.st = s.OpenAPIAs(c, unit.Tag(), password) 67 s.uniter, err = s.st.Uniter() 68 c.Assert(err, jc.ErrorIsNil) 69 c.Assert(s.uniter, gc.NotNil) 70 71 apiRel, err := s.uniter.Relation(s.rel.Tag().(names.RelationTag)) 72 c.Assert(err, jc.ErrorIsNil) 73 apiUnit, err := s.uniter.Unit(unit.Tag().(names.UnitTag)) 74 c.Assert(err, jc.ErrorIsNil) 75 s.apiRelUnit, err = apiRel.Unit(apiUnit) 76 c.Assert(err, jc.ErrorIsNil) 77 } 78 79 func (s *ContextRelationSuite) TestMemberCaching(c *gc.C) { 80 unit, err := s.app.AddUnit(state.AddUnitParams{}) 81 c.Assert(err, jc.ErrorIsNil) 82 ru, err := s.rel.Unit(unit) 83 c.Assert(err, jc.ErrorIsNil) 84 err = ru.EnterScope(map[string]interface{}{"blib": "blob"}) 85 c.Assert(err, jc.ErrorIsNil) 86 settings, err := ru.Settings() 87 c.Assert(err, jc.ErrorIsNil) 88 settings.Set("ping", "pong") 89 _, err = settings.Write() 90 c.Assert(err, jc.ErrorIsNil) 91 92 cache := context.NewRelationCache(s.apiRelUnit.ReadSettings, []string{"u/1"}) 93 ctx := context.NewContextRelation(s.apiRelUnit, cache) 94 95 // Check that uncached settings are read from state. 96 m, err := ctx.ReadSettings("u/1") 97 c.Assert(err, jc.ErrorIsNil) 98 expectMap := settings.Map() 99 expectSettings := convertMap(expectMap) 100 c.Assert(m, gc.DeepEquals, expectSettings) 101 102 // Check that changes to state do not affect the cached settings. 103 settings.Set("ping", "pow") 104 _, err = settings.Write() 105 c.Assert(err, jc.ErrorIsNil) 106 m, err = ctx.ReadSettings("u/1") 107 c.Assert(err, jc.ErrorIsNil) 108 c.Assert(m, gc.DeepEquals, expectSettings) 109 } 110 111 func (s *ContextRelationSuite) TestNonMemberCaching(c *gc.C) { 112 unit, err := s.app.AddUnit(state.AddUnitParams{}) 113 c.Assert(err, jc.ErrorIsNil) 114 ru, err := s.rel.Unit(unit) 115 c.Assert(err, jc.ErrorIsNil) 116 err = ru.EnterScope(map[string]interface{}{"blib": "blob"}) 117 c.Assert(err, jc.ErrorIsNil) 118 settings, err := ru.Settings() 119 c.Assert(err, jc.ErrorIsNil) 120 settings.Set("ping", "pong") 121 _, err = settings.Write() 122 c.Assert(err, jc.ErrorIsNil) 123 124 cache := context.NewRelationCache(s.apiRelUnit.ReadSettings, nil) 125 ctx := context.NewContextRelation(s.apiRelUnit, cache) 126 127 // Check that settings are read from state. 128 m, err := ctx.ReadSettings("u/1") 129 c.Assert(err, jc.ErrorIsNil) 130 expectMap := settings.Map() 131 expectSettings := convertMap(expectMap) 132 c.Assert(m, gc.DeepEquals, expectSettings) 133 134 // Check that changes to state do not affect the obtained settings. 135 settings.Set("ping", "pow") 136 _, err = settings.Write() 137 c.Assert(err, jc.ErrorIsNil) 138 m, err = ctx.ReadSettings("u/1") 139 c.Assert(err, jc.ErrorIsNil) 140 c.Assert(m, gc.DeepEquals, expectSettings) 141 } 142 143 func (s *ContextRelationSuite) TestLocalSettings(c *gc.C) { 144 ctx := context.NewContextRelation(s.apiRelUnit, nil) 145 146 // Change Settings... 147 node, err := ctx.Settings() 148 c.Assert(err, jc.ErrorIsNil) 149 expectSettings := node.Map() 150 expectOldMap := convertSettings(expectSettings) 151 node.Set("change", "exciting") 152 153 // ...and check it's not written to state. 154 settings, err := s.ru.ReadSettings("u/0") 155 c.Assert(err, jc.ErrorIsNil) 156 c.Assert(settings, gc.DeepEquals, expectOldMap) 157 158 // Write settings... 159 err = ctx.WriteSettings() 160 c.Assert(err, jc.ErrorIsNil) 161 162 // ...and check it was written to state. 163 settings, err = s.ru.ReadSettings("u/0") 164 c.Assert(err, jc.ErrorIsNil) 165 c.Assert(settings, gc.DeepEquals, map[string]interface{}{"change": "exciting"}) 166 } 167 168 func convertSettings(settings params.Settings) map[string]interface{} { 169 result := make(map[string]interface{}) 170 for k, v := range settings { 171 result[k] = v 172 } 173 return result 174 } 175 176 func convertMap(settingsMap map[string]interface{}) params.Settings { 177 result := make(params.Settings) 178 for k, v := range settingsMap { 179 result[k] = v.(string) 180 } 181 return result 182 } 183 184 func (s *ContextRelationSuite) TestSuspended(c *gc.C) { 185 _, err := s.app.AddUnit(state.AddUnitParams{}) 186 c.Assert(err, jc.ErrorIsNil) 187 err = s.rel.SetSuspended(true, "") 188 c.Assert(err, jc.ErrorIsNil) 189 190 ctx := context.NewContextRelation(s.apiRelUnit, nil) 191 err = s.apiRelUnit.Relation().Refresh() 192 c.Assert(err, jc.ErrorIsNil) 193 c.Assert(ctx.Suspended(), jc.IsTrue) 194 } 195 196 func (s *ContextRelationSuite) TestSetStatus(c *gc.C) { 197 _, err := s.app.AddUnit(state.AddUnitParams{}) 198 c.Assert(err, jc.ErrorIsNil) 199 claimer, err := s.LeaseManager.Claimer("application-leadership", s.State.ModelUUID()) 200 c.Assert(err, jc.ErrorIsNil) 201 err = claimer.Claim("u", "u/0", time.Minute) 202 c.Assert(err, jc.ErrorIsNil) 203 204 ctx := context.NewContextRelation(s.apiRelUnit, nil) 205 err = ctx.SetStatus(relation.Suspended) 206 c.Assert(err, jc.ErrorIsNil) 207 relStatus, err := s.rel.Status() 208 c.Assert(err, jc.ErrorIsNil) 209 c.Assert(relStatus.Status, gc.Equals, status.Suspended) 210 }