73 lines
2.0 KiB
Go
73 lines
2.0 KiB
Go
![]() |
package daemon
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"path/filepath"
|
||
|
"strings"
|
||
|
|
||
|
"github.com/Sirupsen/logrus"
|
||
|
"github.com/docker/docker/container"
|
||
|
"github.com/docker/docker/pkg/graphdb"
|
||
|
)
|
||
|
|
||
|
// migrateLegacySqliteLinks migrates sqlite links to use links from HostConfig
|
||
|
// when sqlite links were used, hostConfig.Links was set to nil
|
||
|
func (daemon *Daemon) migrateLegacySqliteLinks(db *graphdb.Database, container *container.Container) error {
|
||
|
// if links is populated (or an empty slice), then this isn't using sqlite links and can be skipped
|
||
|
if container.HostConfig == nil || container.HostConfig.Links != nil {
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
logrus.Debugf("migrating legacy sqlite link info for container: %s", container.ID)
|
||
|
|
||
|
fullName := container.Name
|
||
|
if fullName[0] != '/' {
|
||
|
fullName = "/" + fullName
|
||
|
}
|
||
|
|
||
|
// don't use a nil slice, this ensures that the check above will skip once the migration has completed
|
||
|
links := []string{}
|
||
|
children, err := db.Children(fullName, 0)
|
||
|
if err != nil {
|
||
|
if !strings.Contains(err.Error(), "Cannot find child for") {
|
||
|
return err
|
||
|
}
|
||
|
// else continue... it's ok if we didn't find any children, it'll just be nil and we can continue the migration
|
||
|
}
|
||
|
|
||
|
for _, child := range children {
|
||
|
c, err := daemon.GetContainer(child.Entity.ID())
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
links = append(links, c.Name+":"+child.Edge.Name)
|
||
|
}
|
||
|
|
||
|
container.HostConfig.Links = links
|
||
|
return container.WriteHostConfig()
|
||
|
}
|
||
|
|
||
|
// sqliteMigration performs the link graph DB migration.
|
||
|
func (daemon *Daemon) sqliteMigration(containers map[string]*container.Container) error {
|
||
|
// migrate any legacy links from sqlite
|
||
|
linkdbFile := filepath.Join(daemon.root, "linkgraph.db")
|
||
|
var (
|
||
|
legacyLinkDB *graphdb.Database
|
||
|
err error
|
||
|
)
|
||
|
|
||
|
legacyLinkDB, err = graphdb.NewSqliteConn(linkdbFile)
|
||
|
if err != nil {
|
||
|
return fmt.Errorf("error connecting to legacy link graph DB %s, container links may be lost: %v", linkdbFile, err)
|
||
|
}
|
||
|
defer legacyLinkDB.Close()
|
||
|
|
||
|
for _, c := range containers {
|
||
|
if err := daemon.migrateLegacySqliteLinks(legacyLinkDB, c); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
}
|
||
|
return nil
|
||
|
}
|