github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/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/uniter"
    14  	"github.com/juju/juju/apiserver/params"
    15  	"github.com/juju/juju/state"
    16  	"github.com/juju/juju/status"
    17  	"github.com/juju/juju/watcher/watchertest"
    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  	wc := watchertest.NewNotifyWatcherC(c, w, s.BackingState.StartSync)
    48  	defer wc.AssertStops()
    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  
    64  func (s *serviceSuite) TestWatchRelations(c *gc.C) {
    65  	w, err := s.apiService.WatchRelations()
    66  	c.Assert(err, jc.ErrorIsNil)
    67  	wc := watchertest.NewStringsWatcherC(c, w, s.BackingState.StartSync)
    68  	defer wc.AssertStops()
    69  
    70  	// Initial event.
    71  	wc.AssertChange()
    72  	wc.AssertNoChange()
    73  
    74  	// Change something other than the lifecycle and make sure it's
    75  	// not detected.
    76  	err = s.wordpressService.SetExposed()
    77  	c.Assert(err, jc.ErrorIsNil)
    78  	wc.AssertNoChange()
    79  
    80  	// Add another service and relate it to wordpress,
    81  	// check it's detected.
    82  	s.addMachineServiceCharmAndUnit(c, "mysql")
    83  	rel := s.addRelation(c, "wordpress", "mysql")
    84  	wc.AssertChange(rel.String())
    85  
    86  	// Destroy the relation and check it's detected.
    87  	err = rel.Destroy()
    88  	c.Assert(err, jc.ErrorIsNil)
    89  	wc.AssertChange(rel.String())
    90  	wc.AssertNoChange()
    91  }
    92  
    93  func (s *serviceSuite) TestRefresh(c *gc.C) {
    94  	c.Assert(s.apiService.Life(), gc.Equals, params.Alive)
    95  
    96  	err := s.wordpressService.Destroy()
    97  	c.Assert(err, jc.ErrorIsNil)
    98  	c.Assert(s.apiService.Life(), gc.Equals, params.Alive)
    99  
   100  	err = s.apiService.Refresh()
   101  	c.Assert(err, jc.ErrorIsNil)
   102  	c.Assert(s.apiService.Life(), gc.Equals, params.Dying)
   103  }
   104  
   105  func (s *serviceSuite) TestCharmURL(c *gc.C) {
   106  	// Get the charm URL through state calls.
   107  	curl, force := s.wordpressService.CharmURL()
   108  	c.Assert(curl, gc.DeepEquals, s.wordpressCharm.URL())
   109  	c.Assert(force, jc.IsFalse)
   110  
   111  	// Now check the same through the API.
   112  	curl, force, err := s.apiService.CharmURL()
   113  	c.Assert(err, jc.ErrorIsNil)
   114  	c.Assert(curl, gc.DeepEquals, s.wordpressCharm.URL())
   115  	c.Assert(force, jc.IsFalse)
   116  }
   117  
   118  func (s *serviceSuite) TestCharmModifiedVersion(c *gc.C) {
   119  	// Get the charm URL through state calls.
   120  	ver, err := s.apiService.CharmModifiedVersion()
   121  	c.Assert(err, jc.ErrorIsNil)
   122  	c.Assert(ver, gc.Equals, s.wordpressService.CharmModifiedVersion())
   123  }
   124  
   125  func (s *serviceSuite) TestOwnerTag(c *gc.C) {
   126  	tag, err := s.apiService.OwnerTag()
   127  	c.Assert(err, jc.ErrorIsNil)
   128  	c.Assert(tag, gc.Equals, s.AdminUserTag(c))
   129  }
   130  
   131  func (s *serviceSuite) TestSetServiceStatus(c *gc.C) {
   132  	message := "a test message"
   133  	stat, err := s.wordpressService.Status()
   134  	c.Assert(err, jc.ErrorIsNil)
   135  	c.Assert(stat.Status, gc.Not(gc.Equals), status.StatusActive)
   136  	c.Assert(stat.Message, gc.Not(gc.Equals), message)
   137  
   138  	err = s.apiService.SetStatus(s.wordpressUnit.Name(), status.StatusActive, message, map[string]interface{}{})
   139  	c.Check(err, gc.ErrorMatches, `"wordpress/0" is not leader of "wordpress"`)
   140  
   141  	s.claimLeadership(c, s.wordpressUnit, s.wordpressService)
   142  
   143  	err = s.apiService.SetStatus(s.wordpressUnit.Name(), status.StatusActive, message, map[string]interface{}{})
   144  	c.Check(err, jc.ErrorIsNil)
   145  
   146  	stat, err = s.wordpressService.Status()
   147  	c.Check(err, jc.ErrorIsNil)
   148  	c.Check(stat.Status, gc.Equals, status.StatusActive)
   149  	c.Check(stat.Message, gc.Equals, message)
   150  }
   151  
   152  func (s *serviceSuite) TestServiceStatus(c *gc.C) {
   153  	message := "a test message"
   154  	stat, err := s.wordpressService.Status()
   155  	c.Assert(err, jc.ErrorIsNil)
   156  	c.Assert(stat.Status, gc.Not(gc.Equals), status.StatusActive)
   157  	c.Assert(stat.Message, gc.Not(gc.Equals), message)
   158  
   159  	err = s.wordpressService.SetStatus(status.StatusActive, message, map[string]interface{}{})
   160  	c.Check(err, jc.ErrorIsNil)
   161  
   162  	stat, err = s.wordpressService.Status()
   163  	c.Check(err, jc.ErrorIsNil)
   164  	c.Check(stat.Status, gc.Equals, status.StatusActive)
   165  	c.Check(stat.Message, gc.Equals, message)
   166  
   167  	result, err := s.apiService.Status(s.wordpressUnit.Name())
   168  	c.Check(err, gc.ErrorMatches, `"wordpress/0" is not leader of "wordpress"`)
   169  
   170  	s.claimLeadership(c, s.wordpressUnit, s.wordpressService)
   171  	result, err = s.apiService.Status(s.wordpressUnit.Name())
   172  	c.Check(err, jc.ErrorIsNil)
   173  	c.Check(result.Service.Status, gc.Equals, status.StatusActive)
   174  }
   175  
   176  func (s *serviceSuite) claimLeadership(c *gc.C, unit *state.Unit, service *state.Service) {
   177  	claimer := s.State.LeadershipClaimer()
   178  	err := claimer.ClaimLeadership(service.Name(), unit.Name(), time.Minute)
   179  	c.Assert(err, jc.ErrorIsNil)
   180  }