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 }