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  }