Before #16032, once links were setup in the sqlite db, hostConfig.Links was cleared out. This means that we need to migrate data back out of the sqlite db and put it back into hostConfig.Links so that links specified on older daemons can be used. Signed-off-by: Brian Goff <cpuguy83@gmail.com> Upstream-commit: 2600777469b18f7133fc4d6c6c99698d6aa700fe Component: engine
102 lines
2.1 KiB
Go
102 lines
2.1 KiB
Go
package daemon
|
|
|
|
import (
|
|
"encoding/json"
|
|
"io/ioutil"
|
|
"os"
|
|
"path"
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
"github.com/docker/docker/container"
|
|
"github.com/docker/docker/pkg/graphdb"
|
|
"github.com/docker/docker/pkg/stringid"
|
|
containertypes "github.com/docker/engine-api/types/container"
|
|
)
|
|
|
|
func TestMigrateLegacySqliteLinks(t *testing.T) {
|
|
tmpDir, err := ioutil.TempDir("", "legacy-qlite-links-test")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer os.RemoveAll(tmpDir)
|
|
|
|
name1 := "test1"
|
|
c1 := &container.Container{
|
|
CommonContainer: container.CommonContainer{
|
|
ID: stringid.GenerateNonCryptoID(),
|
|
Name: name1,
|
|
HostConfig: &containertypes.HostConfig{},
|
|
},
|
|
}
|
|
c1.Root = tmpDir
|
|
|
|
name2 := "test2"
|
|
c2 := &container.Container{
|
|
CommonContainer: container.CommonContainer{
|
|
ID: stringid.GenerateNonCryptoID(),
|
|
Name: name2,
|
|
},
|
|
}
|
|
|
|
store := &contStore{
|
|
s: map[string]*container.Container{
|
|
c1.ID: c1,
|
|
c2.ID: c2,
|
|
},
|
|
}
|
|
|
|
d := &Daemon{root: tmpDir, containers: store}
|
|
db, err := graphdb.NewSqliteConn(filepath.Join(d.root, "linkgraph.db"))
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if _, err := db.Set("/"+name1, c1.ID); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if _, err := db.Set("/"+name2, c2.ID); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
alias := "hello"
|
|
if _, err := db.Set(path.Join(c1.Name, alias), c2.ID); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if err := d.migrateLegacySqliteLinks(db, c1); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if len(c1.HostConfig.Links) != 1 {
|
|
t.Fatal("expected links to be populated but is empty")
|
|
}
|
|
|
|
expected := name2 + ":" + alias
|
|
actual := c1.HostConfig.Links[0]
|
|
if actual != expected {
|
|
t.Fatalf("got wrong link value, expected: %q, got: %q", expected, actual)
|
|
}
|
|
|
|
// ensure this is persisted
|
|
b, err := ioutil.ReadFile(filepath.Join(c1.Root, "hostconfig.json"))
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
type hc struct {
|
|
Links []string
|
|
}
|
|
var cfg hc
|
|
if err := json.Unmarshal(b, &cfg); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if len(cfg.Links) != 1 {
|
|
t.Fatalf("expected one entry in links, got: %d", len(cfg.Links))
|
|
}
|
|
if cfg.Links[0] != expected { // same expected as above
|
|
t.Fatalf("got wrong link value, expected: %q, got: %q", expected, cfg.Links[0])
|
|
}
|
|
}
|