github.com/wallyworld/juju@v0.0.0-20161013125918-6cf1bc9d917a/state/bakerystorage/interface.go (about) 1 // Copyright 2016 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 // Package bakerystorage provides an implementation 5 // of the bakery Storage interface that uses MongoDB 6 // to store items. 7 // 8 // This is based on gopkg.in/macaroon-bakery.v1/bakery/mgostorage. 9 package bakerystorage 10 11 import ( 12 "time" 13 14 "github.com/juju/errors" 15 "gopkg.in/macaroon-bakery.v1/bakery" 16 "gopkg.in/mgo.v2" 17 18 "github.com/juju/juju/mongo" 19 ) 20 21 // Config contains configuration for creating bakery storage with New. 22 type Config struct { 23 // GetCollection returns a mongo.Collection and a function that 24 // will close any associated resources. 25 GetCollection func() (collection mongo.Collection, closer func()) 26 } 27 28 // Validate validates the configuration. 29 func (c Config) Validate() error { 30 if c.GetCollection == nil { 31 return errors.NotValidf("nil GetCollection") 32 } 33 return nil 34 } 35 36 // ExpirableStorage extends bakery.Storage with the ExpireAt method, 37 // to expire data added at the specified time. 38 type ExpirableStorage interface { 39 bakery.Storage 40 41 // ExpireAt returns a new ExpirableStorage that will expire 42 // added items at the specified time. 43 ExpireAt(time.Time) ExpirableStorage 44 } 45 46 // New returns an implementation of bakery.Storage 47 // that stores all items in MongoDB with an expiry 48 // time. 49 func New(config Config) (ExpirableStorage, error) { 50 if err := config.Validate(); err != nil { 51 return nil, errors.Annotate(err, "validating config") 52 } 53 return &storage{config, time.Time{}}, nil 54 } 55 56 // MongoIndexes returns the indexes to apply to the MongoDB collection. 57 func MongoIndexes() []mgo.Index { 58 return []mgo.Index{expiryTimeIndex} 59 }