Left: | ||
Right: |
OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 } |
OLD | NEW |