github.com/Pankov404/juju@v0.0.0-20150703034450-be266991dceb/api/uniter/service_test.go (about)

     1  // Copyright 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package uniter_test
     5  
     6  import (
     7  	"time"
     8  
     9  	"github.com/juju/names"
    10  	jc "github.com/juju/testing/checkers"
    11  	gc "gopkg.in/check.v1"
    12  
    13  	"github.com/juju/juju/api/base"
    14  	"github.com/juju/juju/api/uniter"
    15  	"github.com/juju/juju/apiserver/params"
    16  	"github.com/juju/juju/leadership"
    17  	"github.com/juju/juju/lease"
    18  	"github.com/juju/juju/state"
    19  	statetesting "github.com/juju/juju/state/testing"
    20  )
    21  
    22  type serviceSuite struct {
    23  	uniterSuite
    24  
    25  	apiService *uniter.Service
    26  }
    27  
    28  var _ = gc.Suite(&serviceSuite{})
    29  
    30  func (s *serviceSuite) SetUpTest(c *gc.C) {
    31  	s.uniterSuite.SetUpTest(c)
    32  
    33  	var err error
    34  	s.apiService, err = s.uniter.Service(s.wordpressService.Tag().(names.ServiceTag))
    35  	c.Assert(err, jc.ErrorIsNil)
    36  
    37  	m, err := lease.NewLeaseManager(s.State)
    38  	c.Assert(err, jc.ErrorIsNil)
    39  	s.AddCleanup(func(c *gc.C) {
    40  		m.Kill()
    41  		c.Assert(m.Wait(), jc.ErrorIsNil)
    42  	})
    43  }
    44  
    45  func (s *serviceSuite) TestNameTagAndString(c *gc.C) {
    46  	c.Assert(s.apiService.Name(), gc.Equals, s.wordpressService.Name())
    47  	c.Assert(s.apiService.String(), gc.Equals, s.wordpressService.String())
    48  	c.Assert(s.apiService.Tag(), gc.Equals, s.wordpressService.Tag().(names.ServiceTag))
    49  }
    50  
    51  func (s *serviceSuite) TestWatch(c *gc.C) {
    52  	c.Assert(s.apiService.Life(), gc.Equals, params.Alive)
    53  
    54  	w, err := s.apiService.Watch()
    55  	c.Assert(err, jc.ErrorIsNil)
    56  	defer statetesting.AssertStop(c, w)
    57  	wc := statetesting.NewNotifyWatcherC(c, s.BackingState, w)
    58  
    59  	// Initial event.
    60  	wc.AssertOneChange()
    61  
    62  	// Change something and check it's detected.
    63  	err = s.wordpressService.SetExposed()
    64  	c.Assert(err, jc.ErrorIsNil)
    65  	wc.AssertOneChange()
    66  
    67  	// Destroy the service and check it's detected.
    68  	err = s.wordpressService.Destroy()
    69  	c.Assert(err, jc.ErrorIsNil)
    70  	wc.AssertOneChange()
    71  
    72  	statetesting.AssertStop(c, w)
    73  	wc.AssertClosed()
    74  }
    75  
    76  func (s *serviceSuite) TestWatchRelations(c *gc.C) {
    77  	w, err := s.apiService.WatchRelations()
    78  	c.Assert(err, jc.ErrorIsNil)
    79  	defer statetesting.AssertStop(c, w)
    80  	wc := statetesting.NewStringsWatcherC(c, s.BackingState, w)
    81  
    82  	// Initial event.
    83  	wc.AssertChange()
    84  	wc.AssertNoChange()
    85  
    86  	// Change something other than the lifecycle and make sure it's
    87  	// not detected.
    88  	err = s.wordpressService.SetExposed()
    89  	c.Assert(err, jc.ErrorIsNil)
    90  	wc.AssertNoChange()
    91  
    92  	// Add another service and relate it to wordpress,
    93  	// check it's detected.
    94  	s.addMachineServiceCharmAndUnit(c, "mysql")
    95  	rel := s.addRelation(c, "wordpress", "mysql")
    96  	wc.AssertChange(rel.String())
    97  
    98  	// Destroy the relation and check it's detected.
    99  	err = rel.Destroy()
   100  	c.Assert(err, jc.ErrorIsNil)
   101  	wc.AssertChange(rel.String())
   102  	wc.AssertNoChange()
   103  
   104  	statetesting.AssertStop(c, w)
   105  	wc.AssertClosed()
   106  }
   107  
   108  func (s *serviceSuite) TestRefresh(c *gc.C) {
   109  	c.Assert(s.apiService.Life(), gc.Equals, params.Alive)
   110  
   111  	err := s.wordpressService.Destroy()
   112  	c.Assert(err, jc.ErrorIsNil)
   113  	c.Assert(s.apiService.Life(), gc.Equals, params.Alive)
   114  
   115  	err = s.apiService.Refresh()
   116  	c.Assert(err, jc.ErrorIsNil)
   117  	c.Assert(s.apiService.Life(), gc.Equals, params.Dying)
   118  }
   119  
   120  func (s *serviceSuite) TestCharmURL(c *gc.C) {
   121  	// Get the charm URL through state calls.
   122  	curl, force := s.wordpressService.CharmURL()
   123  	c.Assert(curl, gc.DeepEquals, s.wordpressCharm.URL())
   124  	c.Assert(force, jc.IsFalse)
   125  
   126  	// Now check the same through the API.
   127  	curl, force, err := s.apiService.CharmURL()
   128  	c.Assert(err, jc.ErrorIsNil)
   129  	c.Assert(curl, gc.DeepEquals, s.wordpressCharm.URL())
   130  	c.Assert(force, jc.IsFalse)
   131  }
   132  
   133  func (s *serviceSuite) TestOwnerTagV0(c *gc.C) {
   134  	s.patchNewState(c, uniter.NewStateV0)
   135  
   136  	tag, err := s.apiService.OwnerTag()
   137  	c.Assert(err, jc.ErrorIsNil)
   138  	c.Assert(tag, gc.Equals, s.AdminUserTag(c))
   139  }
   140  
   141  func (s *serviceSuite) TestOwnerTagV1(c *gc.C) {
   142  	s.patchNewState(c, uniter.NewStateV1)
   143  
   144  	tag, err := s.apiService.OwnerTag()
   145  	c.Assert(err, jc.ErrorIsNil)
   146  	c.Assert(tag, gc.Equals, s.AdminUserTag(c))
   147  }
   148  
   149  func (s *serviceSuite) patchNewState(
   150  	c *gc.C,
   151  	patchFunc func(_ base.APICaller, _ names.UnitTag) *uniter.State,
   152  ) {
   153  	s.uniterSuite.patchNewState(c, patchFunc)
   154  	var err error
   155  	s.apiService, err = s.uniter.Service(s.wordpressService.Tag().(names.ServiceTag))
   156  	c.Assert(err, jc.ErrorIsNil)
   157  }
   158  
   159  func (s *serviceSuite) TestSetServiceStatus(c *gc.C) {
   160  	message := "a test message"
   161  	stat, err := s.wordpressService.Status()
   162  
   163  	c.Assert(stat.Status, gc.Not(gc.Equals), state.Status(params.StatusActive))
   164  	c.Assert(stat.Message, gc.Not(gc.Equals), message)
   165  
   166  	err = s.apiService.SetStatus(s.wordpressUnit.Name(), params.StatusActive, message, map[string]interface{}{})
   167  	c.Assert(err, gc.ErrorMatches, "this unit is not the leader")
   168  
   169  	s.claimLeadership(c, s.wordpressUnit, s.wordpressService)
   170  
   171  	err = s.apiService.SetStatus(s.wordpressUnit.Name(), params.StatusActive, message, map[string]interface{}{})
   172  	c.Assert(err, jc.ErrorIsNil)
   173  
   174  	stat, err = s.wordpressService.Status()
   175  	c.Assert(err, jc.ErrorIsNil)
   176  	c.Assert(stat.Status, gc.Equals, state.Status(params.StatusActive))
   177  	c.Assert(stat.Message, gc.Equals, message)
   178  }
   179  
   180  func (s *serviceSuite) TestServiceStatus(c *gc.C) {
   181  	message := "a test message"
   182  	stat, err := s.wordpressService.Status()
   183  	c.Assert(stat.Status, gc.Not(gc.Equals), state.Status(params.StatusActive))
   184  	c.Assert(stat.Message, gc.Not(gc.Equals), message)
   185  
   186  	err = s.wordpressService.SetStatus(state.Status(params.StatusActive), message, map[string]interface{}{})
   187  	c.Assert(err, jc.ErrorIsNil)
   188  
   189  	stat, err = s.wordpressService.Status()
   190  	c.Assert(err, jc.ErrorIsNil)
   191  	c.Assert(stat.Status, gc.Equals, state.Status(params.StatusActive))
   192  	c.Assert(stat.Message, gc.Equals, message)
   193  
   194  	result, err := s.apiService.Status(s.wordpressUnit.Name())
   195  	c.Assert(err, gc.ErrorMatches, "this unit is not the leader")
   196  
   197  	s.claimLeadership(c, s.wordpressUnit, s.wordpressService)
   198  	result, err = s.apiService.Status(s.wordpressUnit.Name())
   199  	c.Assert(err, jc.ErrorIsNil)
   200  	c.Assert(result.Service.Status, gc.Equals, params.StatusActive)
   201  }
   202  
   203  func (s *serviceSuite) claimLeadership(c *gc.C, unit *state.Unit, service *state.Service) {
   204  	leadership := leadership.NewLeadershipManager(lease.Manager())
   205  	err := leadership.ClaimLeadership(service.Name(), unit.Name(), time.Minute)
   206  	c.Assert(err, jc.ErrorIsNil)
   207  }