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  }