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 }