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