migration_test.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. package layer // import "github.com/docker/docker/layer"
  2. import (
  3. "bytes"
  4. "io"
  5. "os"
  6. "path/filepath"
  7. "runtime"
  8. "testing"
  9. "github.com/docker/docker/daemon/graphdriver"
  10. "github.com/docker/docker/pkg/stringid"
  11. )
  12. func tarFromFilesInGraph(graph graphdriver.Driver, graphID, parentID string, files ...FileApplier) ([]byte, error) {
  13. t, err := tarFromFiles(files...)
  14. if err != nil {
  15. return nil, err
  16. }
  17. if err := graph.Create(graphID, parentID, nil); err != nil {
  18. return nil, err
  19. }
  20. if _, err := graph.ApplyDiff(graphID, parentID, bytes.NewReader(t)); err != nil {
  21. return nil, err
  22. }
  23. ar, err := graph.Diff(graphID, parentID)
  24. if err != nil {
  25. return nil, err
  26. }
  27. defer ar.Close()
  28. return io.ReadAll(ar)
  29. }
  30. func TestLayerMigrationNoTarsplit(t *testing.T) {
  31. // TODO Windows: Figure out why this is failing
  32. if runtime.GOOS == "windows" {
  33. t.Skip("Failing on Windows")
  34. }
  35. td, err := os.MkdirTemp("", "migration-test-")
  36. if err != nil {
  37. t.Fatal(err)
  38. }
  39. defer os.RemoveAll(td)
  40. layer1Files := []FileApplier{
  41. newTestFile("/root/.bashrc", []byte("# Boring configuration"), 0o644),
  42. newTestFile("/etc/profile", []byte("# Base configuration"), 0o644),
  43. }
  44. layer2Files := []FileApplier{
  45. newTestFile("/root/.bashrc", []byte("# Updated configuration"), 0o644),
  46. }
  47. graph, err := newVFSGraphDriver(filepath.Join(td, "graphdriver-"))
  48. if err != nil {
  49. t.Fatal(err)
  50. }
  51. graphID1 := stringid.GenerateRandomID()
  52. graphID2 := stringid.GenerateRandomID()
  53. tar1, err := tarFromFilesInGraph(graph, graphID1, "", layer1Files...)
  54. if err != nil {
  55. t.Fatal(err)
  56. }
  57. tar2, err := tarFromFilesInGraph(graph, graphID2, graphID1, layer2Files...)
  58. if err != nil {
  59. t.Fatal(err)
  60. }
  61. root := filepath.Join(td, "layers")
  62. ls, err := newStoreFromGraphDriver(root, graph)
  63. if err != nil {
  64. t.Fatal(err)
  65. }
  66. newTarDataPath := filepath.Join(td, ".migration-tardata")
  67. diffID, size, err := ls.(*layerStore).ChecksumForGraphID(graphID1, "", newTarDataPath)
  68. if err != nil {
  69. t.Fatal(err)
  70. }
  71. layer1a, err := ls.(*layerStore).RegisterByGraphID(graphID1, "", diffID, newTarDataPath, size)
  72. if err != nil {
  73. t.Fatal(err)
  74. }
  75. layer1b, err := ls.Register(bytes.NewReader(tar1), "")
  76. if err != nil {
  77. t.Fatal(err)
  78. }
  79. assertReferences(t, layer1a, layer1b)
  80. // Attempt register, should be same
  81. layer2a, err := ls.Register(bytes.NewReader(tar2), layer1a.ChainID())
  82. if err != nil {
  83. t.Fatal(err)
  84. }
  85. diffID, size, err = ls.(*layerStore).ChecksumForGraphID(graphID2, graphID1, newTarDataPath)
  86. if err != nil {
  87. t.Fatal(err)
  88. }
  89. layer2b, err := ls.(*layerStore).RegisterByGraphID(graphID2, layer1a.ChainID(), diffID, newTarDataPath, size)
  90. if err != nil {
  91. t.Fatal(err)
  92. }
  93. assertReferences(t, layer2a, layer2b)
  94. if metadata, err := ls.Release(layer2a); err != nil {
  95. t.Fatal(err)
  96. } else if len(metadata) > 0 {
  97. t.Fatalf("Unexpected layer removal after first release: %#v", metadata)
  98. }
  99. metadata, err := ls.Release(layer2b)
  100. if err != nil {
  101. t.Fatal(err)
  102. }
  103. assertMetadata(t, metadata, createMetadata(layer2a))
  104. }