Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code | Sign in
(7)

Side by Side Diff: mstate/state.go

Issue 6495043: mstate: integrated lifecycle into service (Closed)
Patch Set: mstate: integrated lifecycle into service Created 11 years, 7 months ago
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments. Please Sign in to add in-line comments.
Jump to:
View unified diff | Download patch
OLDNEW
1 // The state package enables reading, observing, and changing 1 // The state package enables reading, observing, and changing
2 // the state stored in MongoDB of a whole environment 2 // the state stored in MongoDB of a whole environment
3 // managed by juju. 3 // managed by juju.
4 package mstate 4 package mstate
5 5
6 import ( 6 import (
7 "fmt" 7 "fmt"
8 "labix.org/v2/mgo" 8 "labix.org/v2/mgo"
9 "labix.org/v2/mgo/bson" 9 "labix.org/v2/mgo/bson"
10 "launchpad.net/juju-core/charm" 10 "launchpad.net/juju-core/charm"
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
125 err = s.services.Insert(sdoc) 125 err = s.services.Insert(sdoc)
126 if err != nil { 126 if err != nil {
127 return nil, fmt.Errorf("cannot add service %q:", name, err) 127 return nil, fmt.Errorf("cannot add service %q:", name, err)
128 } 128 }
129 return &Service{st: s, doc: sdoc}, nil 129 return &Service{st: s, doc: sdoc}, nil
130 } 130 }
131 131
132 // RemoveService removes a service from the state. It will also remove all 132 // RemoveService removes a service from the state. It will also remove all
133 // its units and break any of its existing relations. 133 // its units and break any of its existing relations.
134 func (s *State) RemoveService(svc *Service) (err error) { 134 func (s *State) RemoveService(svc *Service) (err error) {
135 // TODO(mue) Will change with full txn integration.
niemeyer 2012/08/28 13:58:12 // TODO: Integrate with txn and do lifecycle prope
TheMue 2012/08/28 14:50:11 Done.
135 defer trivial.ErrorContextf(&err, "cannot remove service %q", svc) 136 defer trivial.ErrorContextf(&err, "cannot remove service %q", svc)
137
138 if svc.doc.Life != Dead {
139 panic(fmt.Errorf("service %q is not dead", svc))
140 }
136 // Remove relations first, to minimize unwanted hook executions. 141 // Remove relations first, to minimize unwanted hook executions.
137 // TODO(mue) Will change with full lifecycle integration.
138 rels, err := svc.Relations() 142 rels, err := svc.Relations()
139 if err != nil { 143 if err != nil {
140 return err 144 return err
141 } 145 }
142 for _, rel := range rels { 146 for _, rel := range rels {
143 err = rel.Die() 147 err = rel.Die()
144 if err != nil { 148 if err != nil {
145 return err 149 return err
146 } 150 }
147 err = s.RemoveRelation(rel) 151 err = s.RemoveRelation(rel)
148 if err != nil { 152 if err != nil {
149 return err 153 return err
150 } 154 }
151 } 155 }
156 // Remove the units.
aram 2012/08/28 13:59:10 Please add a TODO that this is wrong, and the righ
TheMue 2012/08/28 14:50:11 Done.
157 units, err := svc.AllUnits()
158 if err != nil {
159 return err
160 }
161 for _, unit := range units {
162 err = unit.Die()
niemeyer 2012/08/28 13:48:59 What's the win here? You're forcefully destroying
TheMue 2012/08/28 14:50:11 Discussed in IRC.
163 if err != nil {
164 return err
165 }
166 if err = svc.RemoveUnit(unit); err != nil {
167 return err
168 }
169 }
152 // Remove the service. 170 // Remove the service.
153 » sel := bson.D{{"_id", svc.doc.Name}, {"life", Alive}} 171 » sel := bson.D{
154 » change := bson.D{{"$set", bson.D{{"life", Dying}}}} 172 » » {"_id", svc.doc.Name},
155 » err = s.services.Update(sel, change) 173 » » {"life", Dead},
174 » }
175 » err = s.services.Remove(sel)
156 if err != nil { 176 if err != nil {
157 return err 177 return err
158 } 178 }
159 » // Remove the units. 179 » return nil
160 » sel = bson.D{{"service", svc.doc.Name}}
161 » change = bson.D{{"$set", bson.D{{"life", Dying}}}}
162 » _, err = s.units.UpdateAll(sel, change)
163 » return err
164 } 180 }
165 181
166 // Service returns a service state by name. 182 // Service returns a service state by name.
167 func (s *State) Service(name string) (service *Service, err error) { 183 func (s *State) Service(name string) (service *Service, err error) {
168 sdoc := serviceDoc{} 184 sdoc := serviceDoc{}
169 » sel := bson.D{{"_id", name}, {"life", Alive}} 185 » sel := bson.D{{"_id", name}}
170 err = s.services.Find(sel).One(&sdoc) 186 err = s.services.Find(sel).One(&sdoc)
171 if err != nil { 187 if err != nil {
172 return nil, fmt.Errorf("cannot get service %q: %v", name, err) 188 return nil, fmt.Errorf("cannot get service %q: %v", name, err)
173 } 189 }
174 return &Service{st: s, doc: sdoc}, nil 190 return &Service{st: s, doc: sdoc}, nil
175 } 191 }
176 192
177 // AllServices returns all deployed services in the environment. 193 // AllServices returns all deployed services in the environment.
178 func (s *State) AllServices() (services []*Service, err error) { 194 func (s *State) AllServices() (services []*Service, err error) {
179 sdocs := []serviceDoc{} 195 sdocs := []serviceDoc{}
180 » err = s.services.Find(bson.D{{"life", Alive}}).All(&sdocs) 196 » err = s.services.Find(bson.D{}).All(&sdocs)
181 if err != nil { 197 if err != nil {
182 return nil, fmt.Errorf("cannot get all services") 198 return nil, fmt.Errorf("cannot get all services")
183 } 199 }
184 for _, v := range sdocs { 200 for _, v := range sdocs {
185 services = append(services, &Service{st: s, doc: v}) 201 services = append(services, &Service{st: s, doc: v})
186 } 202 }
187 return services, nil 203 return services, nil
188 } 204 }
189 205
190 // AddRelation creates a new relation with the given endpoints. 206 // AddRelation creates a new relation with the given endpoints.
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
270 286
271 // Unit returns a unit by name. 287 // Unit returns a unit by name.
272 func (s *State) Unit(name string) (*Unit, error) { 288 func (s *State) Unit(name string) (*Unit, error) {
273 doc := unitDoc{} 289 doc := unitDoc{}
274 err := s.units.FindId(name).One(&doc) 290 err := s.units.FindId(name).One(&doc)
275 if err != nil { 291 if err != nil {
276 return nil, fmt.Errorf("cannot get unit %q: %v", name, err) 292 return nil, fmt.Errorf("cannot get unit %q: %v", name, err)
277 } 293 }
278 return newUnit(s, &doc), nil 294 return newUnit(s, &doc), nil
279 } 295 }
OLDNEW
« mstate/service.go ('K') | « mstate/service_test.go ('k') | mstate/state_test.go » ('j') | no next file with comments »

Powered by Google App Engine
RSS Feeds Recent Issues | This issue
This is Rietveld f62528b