Documentation ¶
Overview ¶
This is the internal version of the charmstore package. It exposes details to the various API packages that we do not wish to expose to the world at large.
Index ¶
- Constants
- Variables
- func EntityResolvedURL(e *mongodoc.Entity) *router.ResolvedURL
- func EntityStatsKey(url *charm.URL, kind string) []string
- func FieldSelector(fields ...string) map[string]int
- func NewZipFile(f *zip.File) (mongodoc.ZipFile, error)
- func ReaderAtSeeker(r io.ReadSeeker) io.ReaderAt
- func ZipFileReader(zipr io.ReadSeeker, f mongodoc.ZipFile) (io.Reader, error)
- type AggregatedCounts
- type ArchiverTo
- type Blob
- type Counter
- type CounterRequest
- type CounterRequestBy
- type HTTPCloseHandler
- type ListQuery
- type ListResult
- type NewAPIHandlerFunc
- type Pool
- type SearchDoc
- type SearchIndex
- type SearchParams
- type SearchResult
- type Server
- type ServerParams
- type Store
- func (s *Store) AddAudit(entry audit.Entry)
- func (s *Store) AddBundleWithArchive(url *router.ResolvedURL, b charm.Bundle) error
- func (s *Store) AddCharmWithArchive(url *router.ResolvedURL, ch charm.Charm) error
- func (s *Store) AddEntityWithArchive(url *router.ResolvedURL, archive interface{}) error
- func (s *Store) AddLog(data *json.RawMessage, logLevel mongodoc.LogLevel, logType mongodoc.LogType, ...) error
- func (s *Store) ArchiveDownloadCounts(id *charm.URL, refresh bool) (thisRevision, allRevisions AggregatedCounts, err error)
- func (s *Store) Close()
- func (s *Store) Copy() *Store
- func (s *Store) Counters(req *CounterRequest) ([]Counter, error)
- func (s *Store) DeleteEntity(id *router.ResolvedURL) error
- func (s *Store) EntitiesQuery(url *charm.URL) *mgo.Query
- func (s *Store) FindBaseEntity(url *charm.URL, fields map[string]int) (*mongodoc.BaseEntity, error)
- func (s *Store) FindBestEntity(url *charm.URL, channel params.Channel, fields map[string]int) (*mongodoc.Entity, error)
- func (s *Store) FindEntities(url *charm.URL, fields map[string]int) ([]*mongodoc.Entity, error)
- func (s *Store) FindEntity(url *router.ResolvedURL, fields map[string]int) (*mongodoc.Entity, error)
- func (s *Store) Go(f func(*Store))
- func (s *Store) IncCounter(key []string) error
- func (s *Store) IncCounterAsync(key []string)
- func (s *Store) IncCounterAtTime(key []string, t time.Time) error
- func (s *Store) IncrementDownloadCounts(id *router.ResolvedURL) error
- func (s *Store) IncrementDownloadCountsAsync(id *router.ResolvedURL)
- func (s *Store) IncrementDownloadCountsAtTime(id *router.ResolvedURL, t time.Time) error
- func (store *Store) ListQuery(sp SearchParams) (*ListQuery, error)
- func (s *Store) MatchingInterfacesQuery(required, provided []string) *mgo.Query
- func (s *Store) OpenBlob(id *router.ResolvedURL) (*Blob, error)
- func (s *Store) OpenBlobFile(blob *Blob, filePath string) (io.ReadCloser, int64, error)
- func (s *Store) OpenBlobPreV5(id *router.ResolvedURL) (*Blob, error)
- func (s *Store) OpenCachedBlobFile(entity *mongodoc.Entity, fileId mongodoc.FileId, isFile func(f *zip.File) bool) (_ io.ReadCloser, err error)
- func (s *Store) Pool() *Pool
- func (s *Store) Publish(url *router.ResolvedURL, channels ...params.Channel) error
- func (store *Store) Search(sp SearchParams) (SearchResult, error)
- func (s *Store) SetPerms(id *charm.URL, which string, acl ...string) error
- func (s *Store) SetPromulgated(url *router.ResolvedURL, promulgate bool) error
- func (s *Store) SetReconnectTimeout(d time.Duration)
- func (s *Store) SynchroniseElasticsearch() error
- func (s *Store) UpdateBaseEntity(url *router.ResolvedURL, update bson.D) error
- func (s *Store) UpdateEntity(url *router.ResolvedURL, update bson.D) error
- func (s *Store) UpdateSearch(r *router.ResolvedURL) error
- func (s *Store) UpdateSearchAsync(r *router.ResolvedURL)
- func (s *Store) UpdateSearchBaseURL(baseURL *charm.URL) error
- func (s *Store) UpdateSearchFields(r *router.ResolvedURL, fields map[string]interface{}) error
- func (s *Store) UploadEntity(url *router.ResolvedURL, blob io.Reader, blobHash string, size int64, ...) error
- type StoreDatabase
- func (s StoreDatabase) BaseEntities() *mgo.Collection
- func (s StoreDatabase) Close()
- func (s StoreDatabase) Collections() []*mgo.Collection
- func (s StoreDatabase) Entities() *mgo.Collection
- func (s StoreDatabase) Logs() *mgo.Collection
- func (s StoreDatabase) Macaroons() *mgo.Collection
- func (s StoreDatabase) Migrations() *mgo.Collection
- func (s StoreDatabase) StatCounters() *mgo.Collection
- func (s StoreDatabase) StatTokens() *mgo.Collection
Constants ¶
const StatsGranularity = time.Minute
StatsGranularity holds the time granularity of statistics gathering. IncCounter(Async) calls within this duration may be aggregated.
Variables ¶
var (
ErrTooManySessions = errgo.New("too many mongo sessions in use")
)
var LegacyDownloadCountsEnabled = true
LegacyDownloadCountsEnabled represents whether aggregated download counts must be retrieved from the legacy infrastructure. In essence, if the value is true (enabled), aggregated counts are not calculated based on the data stored in the charm store stats; they are instead retrieved from the entity extra-info. For this reason, enabling this we assume an external program updated the extra-info for the entity, specifically the "legacy-download-stats" key. TODO (frankban): this is a temporary hack, and can be removed once we have a more consistent way to import the download counts from the legacy charm store (charms) and from charmworld (bundles). To remove the legacy download counts logic in the future, grep the code for "LegacyDownloadCountsEnabled" and remove as required.
Functions ¶
func EntityResolvedURL ¶
func EntityResolvedURL(e *mongodoc.Entity) *router.ResolvedURL
EntityResolvedURL returns the ResolvedURL for the entity. It requires that the PromulgatedURL field has been filled out in the entity.
func EntityStatsKey ¶
EntityStatsKey returns a stats key for the given charm or bundle reference and the given kind. Entity stats keys are generated using the following schema:
kind:series:name:user:revision
where user can be empty (for promulgated charms/bundles) and revision is optional (e.g. when uploading an entity the revision is not specified). For instance, entities' stats can then be retrieved like the following:
- kind:utopic:* -> all charms of a specific series;
- kind:trusty:django:* -> all revisions and user variations of a charm;
- kind:trusty:django::* -> all revisions of a promulgated charm;
- kind:trusty:django::42 -> a specific promulgated charm;
- kind:trusty:django:who:* -> all revisions of a user owned charm;
- kind:trusty:django:who:42 -> a specific user owned charm;
The above also applies to bundles (where the series is "bundle").
func FieldSelector ¶
FieldSelector returns a field selector that will select the given fields, or all fields if none are specified.
func NewZipFile ¶
NewZipFile returns a new mongodoc zip file reference to the given zip file.
func ReaderAtSeeker ¶
func ReaderAtSeeker(r io.ReadSeeker) io.ReaderAt
ReaderAtSeeker adapts r so that it can be used as a ReaderAt. Note that, contrary to the io.ReaderAt contract, it is not OK to use concurrently.
func ZipFileReader ¶
ZipFileReader returns a reader that will read content referred to by f within zipr, which should refer to the contents of a zip file,
Types ¶
type AggregatedCounts ¶
type AggregatedCounts struct {
LastDay, LastWeek, LastMonth, Total int64
}
AggregatedCounts contains counts for a statistic aggregated over the lastDay, lastWeek, lastMonth and all time.
type ArchiverTo ¶
ArchiverTo can be used to archive a charm or bundle's contents to a writer. It is implemented by *charm.CharmArchive and *charm.BundleArchive.
type Blob ¶
type Blob struct { blobstore.ReadSeekCloser // Size holds the total size of the blob. Size int64 // Hash holds the hash checksum of the blob. Hash string }
Blob represents a blob of data from the charm store.
type CounterRequest ¶
type CounterRequest struct { // Key and Prefix determine the counter keys to match. // If Prefix is false, Key must match exactly. Otherwise, counters // must begin with Key and have at least one more key token. Key []string Prefix bool // If List is true, matching counters are aggregated under their // prefixes instead of being returned as a single overall sum. // // For example, given the following counts: // // {"a", "b"}: 1, // {"a", "c"}: 3 // {"a", "c", "d"}: 5 // {"a", "c", "e"}: 7 // // and assuming that Prefix is true, the following keys will // present the respective results if List is true: // // {"a"} => {{"a", "b"}, 1, false}, // {{"a", "c"}, 3, false}, // {{"a", "c"}, 12, true} // {"a", "c"} => {{"a", "c", "d"}, 3, false}, // {{"a", "c", "e"}, 5, false} // // If List is false, the same key prefixes will present: // // {"a"} => {{"a"}, 16, true} // {"a", "c"} => {{"a", "c"}, 12, false} // List bool // By defines the period covered by each aggregated data point. // If unspecified, it defaults to ByAll, which aggregates all // matching data points in a single entry. By CounterRequestBy // Start, if provided, changes the query so that only data points // ocurring at the given time or afterwards are considered. Start time.Time // Stop, if provided, changes the query so that only data points // ocurring at the given time or before are considered. Stop time.Time }
CounterRequest represents a request to aggregate counter values.
type CounterRequestBy ¶
type CounterRequestBy int
const ( ByAll CounterRequestBy = iota ByDay ByWeek )
type HTTPCloseHandler ¶
HTTPCloseHandler represents a HTTP handler that must be closed after use.
type ListQuery ¶
type ListQuery struct {
// contains filtered or unexported fields
}
ListQuery holds a list query from which an iterator can be created.
type ListResult ¶
ListResult represents the result of performing a list.
type NewAPIHandlerFunc ¶
type NewAPIHandlerFunc func(pool *Pool, p ServerParams, absPath string) HTTPCloseHandler
NewAPIHandlerFunc is a function that returns a new API handler that uses the given Store. The absPath parameter holds the root path of the API handler.
type Pool ¶
type Pool struct {
// contains filtered or unexported fields
}
Pool holds a connection to the underlying charm and blob data stores. Calling its Store method returns a new Store from the pool that can be used to process short-lived requests to access and modify the store.
func NewPool ¶
func NewPool(db *mgo.Database, si *SearchIndex, bakeryParams *bakery.NewServiceParams, config ServerParams) (*Pool, error)
NewPool returns a Pool that uses the given database and search index. If bakeryParams is not nil, the Bakery field in the resulting Store will be set to a new Service that stores macaroons in mongo.
The pool must be closed (with the Close method) after use.
func (*Pool) Close ¶
func (p *Pool) Close()
Close closes the pool. This must be called when the pool is finished with.
func (*Pool) RequestStore ¶
RequestStore returns a store for a client request. It returns an error with a ErrTooManySessions cause if too many mongo sessions are in use.
type SearchDoc ¶
type SearchDoc struct { *mongodoc.Entity TotalDownloads int64 ReadACLs []string Series []string // SingleSeries is true if the document referes to an entity that // describes a single series. This will either be a bundle, a // single-series charm or an expanded record for a multi-series // charm. SingleSeries bool // AllSeries is true if the document referes to an entity that // describes all series supported by the entity. This will either // be a bundle, a single-series charm or the canonical record for // a multi-series charm. AllSeries bool }
SearchDoc is a mongodoc.Entity with additional fields useful for searching. This is the document that is stored in the search index.
type SearchIndex ¶
type SearchIndex struct { *elasticsearch.Database Index string }
func (*SearchIndex) GetSearchDocument ¶
func (si *SearchIndex) GetSearchDocument(id *charm.URL) (*SearchDoc, error)
GetSearchDocument retrieves the current search record for the charm reference id.
type SearchParams ¶
type SearchParams struct { // The text to use in the full text search query. Text string // If autocomplete is specified, the search will return only charms and // bundles with a name that has text as a prefix. AutoComplete bool // Limit the search to items with attributes that match the specified filter value. Filters map[string][]string // Limit the number of returned items to the specified count. Limit int // Include the following metadata items in the search results. Include []string // Start the the returned items at a specific offset. Skip int // ACL values to search in addition to everyone. ACL values may represent user names // or group names. Groups []string // Admin searches will not filter on the ACL and will show results for all matching // charms. Admin bool // ExpandedMultiSeries returns a number of entries for // multi-series charms, one for each entity. ExpandedMultiSeries bool // contains filtered or unexported fields }
SearchParams represents the search parameters used to search the store.
func (*SearchParams) ParseSortFields ¶
func (sp *SearchParams) ParseSortFields(f ...string) error
type SearchResult ¶
SearchResult represents the result of performing a search. The entites in Results will have the following fields completed:
- URL
- SupportedSeries
- PromulgatedURL
- PromulgatedRevision
type Server ¶
type Server struct {
// contains filtered or unexported fields
}
func NewServer ¶
func NewServer(db *mgo.Database, si *SearchIndex, config ServerParams, versions map[string]NewAPIHandlerFunc) (*Server, error)
NewServer returns a handler that serves the given charm store API versions using db to store that charm store data. An optional elasticsearch configuration can be specified in si. If elasticsearch is not being used then si can be set to nil. The key of the versions map is the version name. The handler configuration is provided to all version handlers.
The returned Server should be closed after use.
type ServerParams ¶
type ServerParams struct { // AuthUsername and AuthPassword hold the credentials // used for HTTP basic authentication. AuthUsername string AuthPassword string // IdentityLocation holds the location of the third party authorization // service to use when creating third party caveats, // for example: http://api.jujucharms.com/identity/v1/discharger // If it is empty, IdentityURL+"/v1/discharger" will be used. IdentityLocation string // TermsLocation holds the location of the third party // terms service to use when creating third party caveats. TermsLocation string // PublicKeyLocator holds a public key store. // It may be nil. PublicKeyLocator bakery.PublicKeyLocator // IdentityAPIURL holds the URL of the identity manager, // for example http://api.jujucharms.com/identity IdentityAPIURL string // AgentUsername and AgentKey hold the credentials used for agent // authentication. AgentUsername string AgentKey *bakery.KeyPair // StatsCacheMaxAge is the maximum length of time between // refreshes of entities in the stats cache. StatsCacheMaxAge time.Duration // SearchCacheMaxAge is the maximum length of time between // refreshes of entities in the search cache. SearchCacheMaxAge time.Duration // MaxMgoSessions specifies a soft limit on the maximum // number of mongo sessions used. Each concurrent // HTTP request will use one session. MaxMgoSessions int // HTTPRequestWaitDuration holds the amount of time // that an HTTP request will wait for a free connection // when the MaxConcurrentHTTPRequests limit is reached. HTTPRequestWaitDuration time.Duration // AuditLogger optionally holds the logger which will be used to // write audit log entries. AuditLogger *lumberjack.Logger }
ServerParams holds configuration for a new internal API server.
type Store ¶
type Store struct { DB StoreDatabase BlobStore *blobstore.Store ES *SearchIndex Bakery *bakery.Service // contains filtered or unexported fields }
Store holds a connection to the underlying charm and blob data stores that is appropriate for short term use.
func (*Store) AddBundleWithArchive ¶
func (s *Store) AddBundleWithArchive(url *router.ResolvedURL, b charm.Bundle) error
AddBundleWithArchive adds the given bundle, which must be either a *charm.BundleDir or implement ArchiverTo, to the charmstore under the given URL.
This method is provided for testing purposes only.
func (*Store) AddCharmWithArchive ¶
func (s *Store) AddCharmWithArchive(url *router.ResolvedURL, ch charm.Charm) error
AddCharmWithArchive adds the given charm, which must be either a *charm.CharmDir or implement ArchiverTo, to the charmstore under the given URL.
This method is provided for testing purposes only.
func (*Store) AddEntityWithArchive ¶
func (s *Store) AddEntityWithArchive(url *router.ResolvedURL, archive interface{}) error
AddEntityWithArchive provides the implementation for both AddCharmWithArchive and AddBundleWithArchive. It accepts charm.Charm or charm.Bundle implementations defined in the charm package, and any that implement ArchiverTo.
func (*Store) AddLog ¶
func (s *Store) AddLog(data *json.RawMessage, logLevel mongodoc.LogLevel, logType mongodoc.LogType, urls []*charm.URL) error
AddLog adds a log message to the database.
func (*Store) ArchiveDownloadCounts ¶
func (s *Store) ArchiveDownloadCounts(id *charm.URL, refresh bool) (thisRevision, allRevisions AggregatedCounts, err error)
ArchiveDownloadCounts calculates the aggregated download counts for a charm or bundle.
func (*Store) Copy ¶
Copy returns a new store with a lifetime independent of s. Use this method if you need to use a store in an independent goroutine.
It must be closed (with the Close method) after use.
func (*Store) Counters ¶
func (s *Store) Counters(req *CounterRequest) ([]Counter, error)
Counters aggregates and returns counter values according to the provided request.
func (*Store) DeleteEntity ¶
func (s *Store) DeleteEntity(id *router.ResolvedURL) error
func (*Store) EntitiesQuery ¶
func (s *Store) EntitiesQuery(url *charm.URL) *mgo.Query
EntitiesQuery creates a mgo.Query object that can be used to find entities matching the given URL. If the given URL has no user then the produced query will only match promulgated entities. If the given URL channel is not "development" then the produced query will only match published entities.
func (*Store) FindBaseEntity ¶
FindBaseEntity finds the base entity in the store using the given URL, which can either represent a fully qualified entity or a base id. If fields is not nil, only those fields will be populated in the returned base entity.
func (*Store) FindBestEntity ¶
func (s *Store) FindBestEntity(url *charm.URL, channel params.Channel, fields map[string]int) (*mongodoc.Entity, error)
FindBestEntity finds the entity that provides the preferred match to the given URL, on the given channel. If the given URL has no user then only promulgated entities will be queried. If fields is not nil, only those fields will be populated in the returned entities.
If the URL contains a revision then it is assumed to be fully formed and refer to a single entity; the channel is ignored.
If the URL does not contain a revision then the channel is searched for the best match, here NoChannel will be treated as params.StableChannel.
func (*Store) FindEntities ¶
FindEntities finds all entities in the store matching the given URL. If the given URL has no user then only promulgated entities will be queried. If the given URL channel does not represent an entity under development then only published entities will be queried. If fields is not nil, only its fields will be populated in the returned entities.
func (*Store) FindEntity ¶
func (s *Store) FindEntity(url *router.ResolvedURL, fields map[string]int) (*mongodoc.Entity, error)
FindEntity finds the entity in the store with the given URL, which must be fully qualified. If the given URL has no user then it is assumed to be a promulgated entity. If fields is not nil, only its fields will be populated in the returned entities.
func (*Store) Go ¶
Go runs the given function in a new goroutine, passing it a copy of s, which will be closed after the function returns.
func (*Store) IncCounter ¶
IncCounter increases by one the counter associated with the composed key.
func (*Store) IncCounterAsync ¶
IncCounterAsync increases by one the counter associated with the composed key. The action is done in the background using a separate goroutine.
func (*Store) IncCounterAtTime ¶
IncCounterAtTime increases by one the counter associated with the composed key, associating it with the given time.
func (*Store) IncrementDownloadCounts ¶
func (s *Store) IncrementDownloadCounts(id *router.ResolvedURL) error
IncrementDownloadCounts updates the download statistics for entity id in both the statistics database and the search database.
func (*Store) IncrementDownloadCountsAsync ¶
func (s *Store) IncrementDownloadCountsAsync(id *router.ResolvedURL)
IncrementDownloadCountsAsync updates the download statistics for entity id in both the statistics database and the search database. The action is done in the background using a separate goroutine.
func (*Store) IncrementDownloadCountsAtTime ¶
IncrementDownloadCountsAtTime updates the download statistics for entity id in both the statistics database and the search database, associating it with the given time.
func (*Store) ListQuery ¶
func (store *Store) ListQuery(sp SearchParams) (*ListQuery, error)
ListQuery lists entities in the store that conform to the given search paramerters. It returns a ListQuery that can be used to iterate through the list.
func (*Store) MatchingInterfacesQuery ¶
MatchingInterfacesQuery returns a mongo query that will find any charms that require any interfaces in the required slice or provide any interfaces in the provided slice.
func (*Store) OpenBlob ¶
func (s *Store) OpenBlob(id *router.ResolvedURL) (*Blob, error)
OpenBlob returns the blob associated with the given URL.
func (*Store) OpenBlobFile ¶
OpenBlobFile opens the file with the given path from the given blob and returns a reader for its contents, and its size.
If no such file was found, it returns an error with a params.ErrNotFound cause.
If the file is actually a directory in the blob, it returns an error with a params.ErrForbidden cause.
func (*Store) OpenBlobPreV5 ¶
func (s *Store) OpenBlobPreV5(id *router.ResolvedURL) (*Blob, error)
OpenBlob returns the blob associated with the given URL. As required by pre-v5 versions of the API, it will return a blob with a hacked-up metadata.yaml that elides the Series field.
func (*Store) OpenCachedBlobFile ¶
func (s *Store) OpenCachedBlobFile( entity *mongodoc.Entity, fileId mongodoc.FileId, isFile func(f *zip.File) bool, ) (_ io.ReadCloser, err error)
OpenCachedBlobFile opens a file from the given entity's archive blob. The file is identified by the provided fileId. If the file has not previously been opened on this entity, the isFile function will be used to determine which file in the zip file to use. The result will be cached for the next time.
When retrieving the entity, at least the BlobName and Contents fields must be populated.
func (*Store) Publish ¶
Publish assigns channels to the entity corresponding to the given URL. An error is returned if no channels are provided. For the time being, the only supported channels are "development" and "stable".
func (*Store) Search ¶
func (store *Store) Search(sp SearchParams) (SearchResult, error)
Search searches the store for the given SearchParams. It returns a SearchResult containing the results of the search.
func (*Store) SetPerms ¶
SetPerms sets the ACL specified by which for the base entity with the given id. The which parameter is in the form "[channel].operation", where channel, if specified, is one of "development" or "stable" and operation is one of "read" or "write". If which does not specify a channel then the unpublished ACL is updated. This is only provided for testing.
func (*Store) SetPromulgated ¶
func (s *Store) SetPromulgated(url *router.ResolvedURL, promulgate bool) error
SetPromulgated sets whether the base entity of url is promulgated, If promulgated is true it also unsets promulgated on any other base entity for entities with the same name. It also calculates the next promulgated URL for the entities owned by the new owner and sets those entities appropriately.
Note: This code is known to have some unfortunate (but not dangerous) race conditions. It is possible that if one or more promulgations happens concurrently for the same entity name then it could result in more than one base entity being promulgated. If this happens then uploads to either user will get promulgated names, these names will never clash. This situation is easily remedied by setting the promulgated user for this charm again, even to one of the ones that is already promulgated. It can also result in the latest promulgated revision of the charm not being one created by the promulgated user. This will be remedied when a new charm is uploaded by the promulgated user. As promulgation is a rare operation, it is considered that the chances this will happen are slim.
func (*Store) SetReconnectTimeout ¶
SetReconnectTimeout sets the length of time that mongo requests will block waiting to reconnect to a disconnected mongo server. If it is zero, requests may block forever.
func (*Store) SynchroniseElasticsearch ¶
SynchroniseElasticsearch creates new indexes in elasticsearch and populates them with the current data from the mongodb database.
func (*Store) UpdateBaseEntity ¶
UpdateBaseEntity applies the provided update to the base entity of url. If there are no entries in update then no update is performed, and no error is returned.
func (*Store) UpdateEntity ¶
UpdateEntity applies the provided update to the entity described by url. If there are no entries in update then no update is performed, and no error is returned.
func (*Store) UpdateSearch ¶
func (s *Store) UpdateSearch(r *router.ResolvedURL) error
UpdateSearch updates the search record for the entity reference r. The search index only includes the latest stable revision of each entity so the latest stable revision of the charm specified by r will be indexed.
func (*Store) UpdateSearchAsync ¶
func (s *Store) UpdateSearchAsync(r *router.ResolvedURL)
UpdateSearchAsync will update the search record for the entity reference r in the backgroud.
func (*Store) UpdateSearchBaseURL ¶
UpdateSearchBaseURL updates the search record for all entities with the specified base URL. It must be called whenever the entry for the given URL in the BaseEntitites collection has changed.
func (*Store) UpdateSearchFields ¶
func (s *Store) UpdateSearchFields(r *router.ResolvedURL, fields map[string]interface{}) error
UpdateSearchFields updates the search record for the entity reference r with the updated values in fields.
func (*Store) UploadEntity ¶
func (s *Store) UploadEntity(url *router.ResolvedURL, blob io.Reader, blobHash string, size int64, chans []params.Channel) error
UploadEntity reads the given blob, which should have the given hash and size, and uploads it to the charm store, associating it with the given channels (without actually making it current in any of them).
The following error causes may be returned:
params.ErrDuplicateUpload if the URL duplicates an existing entity. params.ErrEntityIdNotAllowed if the id may not be created. params.ErrInvalidEntity if the provided blob is invalid.
type StoreDatabase ¶
type StoreDatabase struct {
*mgo.Database
}
StoreDatabase wraps an mgo.DB ands adds a few convenience methods.
func (StoreDatabase) BaseEntities ¶
func (s StoreDatabase) BaseEntities() *mgo.Collection
BaseEntities returns the mongo collection where base entities are stored.
func (StoreDatabase) Close ¶
func (s StoreDatabase) Close()
Close closes the store database's underlying session.
func (StoreDatabase) Collections ¶
func (s StoreDatabase) Collections() []*mgo.Collection
Collections returns a slice of all the collections used by the charm store.
func (StoreDatabase) Entities ¶
func (s StoreDatabase) Entities() *mgo.Collection
Entities returns the mongo collection where entities are stored.
func (StoreDatabase) Logs ¶
func (s StoreDatabase) Logs() *mgo.Collection
Logs returns the Mongo collection where charm store logs are stored.
func (StoreDatabase) Macaroons ¶
func (s StoreDatabase) Macaroons() *mgo.Collection
func (StoreDatabase) Migrations ¶
func (s StoreDatabase) Migrations() *mgo.Collection
Migrations returns the Mongo collection where the migration info is stored.
func (StoreDatabase) StatCounters ¶
func (s StoreDatabase) StatCounters() *mgo.Collection
func (StoreDatabase) StatTokens ¶
func (s StoreDatabase) StatTokens() *mgo.Collection