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 }