// Track inserts the provided payload info in state. If the payload // is already in the DB then it is replaced. func (up UnitPayloads) Track(pl payload.Payload) error { // XXX OMFG payload/context/register.go:83 launches bad data // which flies on a majestic unvalidated arc right through the // system until it lands here. This code should be: // // if pl.Unit != up.unit { // return errors.NotValidf("unexpected Unit %q", pl.Unit) // } // // ...but is instead: pl.Unit = up.unit if err := pl.Validate(); err != nil { return errors.Trace(err) } doc := nsPayloads.asDoc(payload.FullPayloadInfo{ Payload: pl, Machine: up.machine, }) change := payloadTrackChange{doc} if err := Apply(up.db, change); err != nil { return errors.Trace(err) } return nil }
// Track records the payload info in the hook context. func (c *Context) Track(pl payload.Payload) error { logger.Tracef("adding %q to hook context: %#v", pl.FullID(), pl) if err := pl.Validate(); err != nil { return errors.Trace(err) } // TODO(ericsnow) We are likely missing mechanisim for local persistence. id := pl.FullID() c.updates[id] = pl return nil }
// Track inserts the provided payload info in state. The new Juju ID // for the payload is returned. func (uw UnitPayloads) Track(pl payload.Payload) error { logger.Tracef("tracking %#v", pl) if err := pl.Validate(); err != nil { return errors.NewNotValid(err, "bad payload") } id, err := uw.newID() if err != nil { return errors.Trace(err) } ok, err := uw.Persist.Track(id, pl) if err != nil { return errors.Trace(err) } if !ok { return errors.NotValidf("payload %s (already in state)", id) } return nil }