github.com/wallyworld/juju@v0.0.0-20161013125918-6cf1bc9d917a/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 jc "github.com/juju/testing/checkers" 8 "github.com/juju/utils" 9 gc "gopkg.in/check.v1" 10 "gopkg.in/juju/names.v2" 11 12 "github.com/juju/juju/api" 13 apiuniter "github.com/juju/juju/api/uniter" 14 "github.com/juju/juju/apiserver/params" 15 "github.com/juju/juju/juju/testing" 16 "github.com/juju/juju/state" 17 "github.com/juju/juju/worker/uniter/runner/context" 18 ) 19 20 type ContextRelationSuite struct { 21 testing.JujuConnSuite 22 svc *state.Application 23 rel *state.Relation 24 ru *state.RelationUnit 25 26 st api.Connection 27 uniter *apiuniter.State 28 apiRelUnit *apiuniter.RelationUnit 29 } 30 31 var _ = gc.Suite(&ContextRelationSuite{}) 32 33 func (s *ContextRelationSuite) SetUpTest(c *gc.C) { 34 s.JujuConnSuite.SetUpTest(c) 35 machine, err := s.State.AddMachine("quantal", state.JobHostUnits) 36 c.Assert(err, jc.ErrorIsNil) 37 password, err := utils.RandomPassword() 38 c.Assert(err, jc.ErrorIsNil) 39 err = machine.SetPassword(password) 40 c.Assert(err, jc.ErrorIsNil) 41 err = machine.SetProvisioned("foo", "fake_nonce", nil) 42 c.Assert(err, jc.ErrorIsNil) 43 44 ch := s.AddTestingCharm(c, "riak") 45 s.svc = s.AddTestingService(c, "u", ch) 46 rels, err := s.svc.Relations() 47 c.Assert(err, jc.ErrorIsNil) 48 c.Assert(rels, gc.HasLen, 1) 49 s.rel = rels[0] 50 unit, err := s.svc.AddUnit() 51 c.Assert(err, jc.ErrorIsNil) 52 err = unit.AssignToMachine(machine) 53 s.ru, err = s.rel.Unit(unit) 54 c.Assert(err, jc.ErrorIsNil) 55 err = s.ru.EnterScope(nil) 56 c.Assert(err, jc.ErrorIsNil) 57 58 password, err = utils.RandomPassword() 59 c.Assert(err, jc.ErrorIsNil) 60 err = unit.SetPassword(password) 61 c.Assert(err, jc.ErrorIsNil) 62 s.st = s.OpenAPIAs(c, unit.Tag(), password) 63 s.uniter, err = s.st.Uniter() 64 c.Assert(err, jc.ErrorIsNil) 65 c.Assert(s.uniter, gc.NotNil) 66 67 apiRel, err := s.uniter.Relation(s.rel.Tag().(names.RelationTag)) 68 c.Assert(err, jc.ErrorIsNil) 69 apiUnit, err := s.uniter.Unit(unit.Tag().(names.UnitTag)) 70 c.Assert(err, jc.ErrorIsNil) 71 s.apiRelUnit, err = apiRel.Unit(apiUnit) 72 c.Assert(err, jc.ErrorIsNil) 73 } 74 75 func (s *ContextRelationSuite) TestMemberCaching(c *gc.C) { 76 unit, err := s.svc.AddUnit() 77 c.Assert(err, jc.ErrorIsNil) 78 ru, err := s.rel.Unit(unit) 79 c.Assert(err, jc.ErrorIsNil) 80 err = ru.EnterScope(map[string]interface{}{"blib": "blob"}) 81 c.Assert(err, jc.ErrorIsNil) 82 settings, err := ru.Settings() 83 c.Assert(err, jc.ErrorIsNil) 84 settings.Set("ping", "pong") 85 _, err = settings.Write() 86 c.Assert(err, jc.ErrorIsNil) 87 88 cache := context.NewRelationCache(s.apiRelUnit.ReadSettings, []string{"u/1"}) 89 ctx := context.NewContextRelation(s.apiRelUnit, cache) 90 91 // Check that uncached settings are read from state. 92 m, err := ctx.ReadSettings("u/1") 93 c.Assert(err, jc.ErrorIsNil) 94 expectMap := settings.Map() 95 expectSettings := convertMap(expectMap) 96 c.Assert(m, gc.DeepEquals, expectSettings) 97 98 // Check that changes to state do not affect the cached settings. 99 settings.Set("ping", "pow") 100 _, err = settings.Write() 101 c.Assert(err, jc.ErrorIsNil) 102 m, err = ctx.ReadSettings("u/1") 103 c.Assert(err, jc.ErrorIsNil) 104 c.Assert(m, gc.DeepEquals, expectSettings) 105 } 106 107 func (s *ContextRelationSuite) TestNonMemberCaching(c *gc.C) { 108 unit, err := s.svc.AddUnit() 109 c.Assert(err, jc.ErrorIsNil) 110 ru, err := s.rel.Unit(unit) 111 c.Assert(err, jc.ErrorIsNil) 112 err = ru.EnterScope(map[string]interface{}{"blib": "blob"}) 113 c.Assert(err, jc.ErrorIsNil) 114 settings, err := ru.Settings() 115 c.Assert(err, jc.ErrorIsNil) 116 settings.Set("ping", "pong") 117 _, err = settings.Write() 118 c.Assert(err, jc.ErrorIsNil) 119 120 cache := context.NewRelationCache(s.apiRelUnit.ReadSettings, nil) 121 ctx := context.NewContextRelation(s.apiRelUnit, cache) 122 123 // Check that settings are read from state. 124 m, err := ctx.ReadSettings("u/1") 125 c.Assert(err, jc.ErrorIsNil) 126 expectMap := settings.Map() 127 expectSettings := convertMap(expectMap) 128 c.Assert(m, gc.DeepEquals, expectSettings) 129 130 // Check that changes to state do not affect the obtained settings. 131 settings.Set("ping", "pow") 132 _, err = settings.Write() 133 c.Assert(err, jc.ErrorIsNil) 134 m, err = ctx.ReadSettings("u/1") 135 c.Assert(err, jc.ErrorIsNil) 136 c.Assert(m, gc.DeepEquals, expectSettings) 137 } 138 139 func (s *ContextRelationSuite) TestLocalSettings(c *gc.C) { 140 ctx := context.NewContextRelation(s.apiRelUnit, nil) 141 142 // Change Settings... 143 node, err := ctx.Settings() 144 c.Assert(err, jc.ErrorIsNil) 145 expectSettings := node.Map() 146 expectOldMap := convertSettings(expectSettings) 147 node.Set("change", "exciting") 148 149 // ...and check it's not written to state. 150 settings, err := s.ru.ReadSettings("u/0") 151 c.Assert(err, jc.ErrorIsNil) 152 c.Assert(settings, gc.DeepEquals, expectOldMap) 153 154 // Write settings... 155 err = ctx.WriteSettings() 156 c.Assert(err, jc.ErrorIsNil) 157 158 // ...and check it was written to state. 159 settings, err = s.ru.ReadSettings("u/0") 160 c.Assert(err, jc.ErrorIsNil) 161 c.Assert(settings, gc.DeepEquals, map[string]interface{}{"change": "exciting"}) 162 } 163 164 func convertSettings(settings params.Settings) map[string]interface{} { 165 result := make(map[string]interface{}) 166 for k, v := range settings { 167 result[k] = v 168 } 169 return result 170 } 171 172 func convertMap(settingsMap map[string]interface{}) params.Settings { 173 result := make(params.Settings) 174 for k, v := range settingsMap { 175 result[k] = v.(string) 176 } 177 return result 178 }