Links v2: Remove the graphdb. Replace with code and json structure.

This is a rewrite of the graphdb and replaces all naming and aliasing functionality. The new architecture is called a "container index" and was based 

**Bugs**: notably `docker ps -a` from earlier versions will panic if there are containers to list, because of a string handling bug. I really don't want to lose this patch over this, so suggestions for a workable fix are welcome.

More patches will likely need to be filed to deal with alias management and links. The focus here is to replace graphdb in a backwards-compatible fashion.

This code still imports graphdb for the purposes of the migrating data from one format to another. At some point this code should be removed, maybe in 1.5 or 1.6. It will improve build time dramatically. :)

The migration is not tested but many other features are. Tests for the index itself are largely a side-effect of the integration-cli tests and other integrations.

Many tests were rewritten to accommodate the new naming system (which contains no syntax) but otherwise are unchanged to preserve the tests. In a few minor cases tests were removed because they were no longer relevant, e.g., tests that turn the links structure into a graphdb path and then test that path.

Don't merge this until links is completely ready. Please let me know if you have any other questions.


Good point, I’ll be fixing it in my next revision.

On Sep 22, 2014, at 12:36 PM, Alexandr Morozov <notifications@github.com> wrote:

> In daemon/index.go:
> 
> > +	AliasChildMap  map[string]map[string]string
> > +	NameToID       map[string]string
> > +	IDToName       map[string]string
> > +
> > +	idToContainer map[string]*Container
> > +	daemon        *Daemon
> > +	indexPath     string
> > +	truncIndex    *truncindex.TruncIndex
> > +
> > +	sync.Mutex
> > +}
> > +
> > +// Create a new container index. Note that any existing container index will be
> > +// loaded on this call. If you wish to get an empty container index, see
> > +// emptyContainerIndex().
> > +func newContainerIndex(root string, daemon *Daemon) (*containerIndex, error) {
> This function is just call of loadContainerIndex(root, daemon), nothing more. Why we need it?
> 
> —
> Reply to this email directly or view it on GitHub.
>