Signed-off-by: Cristian Staretu <cristian.staretu@gmail.com>
| ... | ... |
@@ -3304,6 +3304,118 @@ RUN cat /existing-directory-trailing-slash/test/foo | grep Hi` |
| 3304 | 3304 |
logDone("build - ADD tar")
|
| 3305 | 3305 |
} |
| 3306 | 3306 |
|
| 3307 |
+func TestBuildAddTarXz(t *testing.T) {
|
|
| 3308 |
+ name := "testbuildaddtarxz" |
|
| 3309 |
+ defer deleteImages(name) |
|
| 3310 |
+ |
|
| 3311 |
+ ctx := func() *FakeContext {
|
|
| 3312 |
+ dockerfile := ` |
|
| 3313 |
+ FROM busybox |
|
| 3314 |
+ ADD test.tar.xz / |
|
| 3315 |
+ RUN cat /test/foo | grep Hi` |
|
| 3316 |
+ tmpDir, err := ioutil.TempDir("", "fake-context")
|
|
| 3317 |
+ testTar, err := os.Create(filepath.Join(tmpDir, "test.tar")) |
|
| 3318 |
+ if err != nil {
|
|
| 3319 |
+ t.Fatalf("failed to create test.tar archive: %v", err)
|
|
| 3320 |
+ } |
|
| 3321 |
+ defer testTar.Close() |
|
| 3322 |
+ |
|
| 3323 |
+ tw := tar.NewWriter(testTar) |
|
| 3324 |
+ |
|
| 3325 |
+ if err := tw.WriteHeader(&tar.Header{
|
|
| 3326 |
+ Name: "test/foo", |
|
| 3327 |
+ Size: 2, |
|
| 3328 |
+ }); err != nil {
|
|
| 3329 |
+ t.Fatalf("failed to write tar file header: %v", err)
|
|
| 3330 |
+ } |
|
| 3331 |
+ if _, err := tw.Write([]byte("Hi")); err != nil {
|
|
| 3332 |
+ t.Fatalf("failed to write tar file content: %v", err)
|
|
| 3333 |
+ } |
|
| 3334 |
+ if err := tw.Close(); err != nil {
|
|
| 3335 |
+ t.Fatalf("failed to close tar archive: %v", err)
|
|
| 3336 |
+ } |
|
| 3337 |
+ xzCompressCmd := exec.Command("xz", "test.tar")
|
|
| 3338 |
+ xzCompressCmd.Dir = tmpDir |
|
| 3339 |
+ out, _, err := runCommandWithOutput(xzCompressCmd) |
|
| 3340 |
+ if err != nil {
|
|
| 3341 |
+ t.Fatal(err, out) |
|
| 3342 |
+ } |
|
| 3343 |
+ |
|
| 3344 |
+ if err := ioutil.WriteFile(filepath.Join(tmpDir, "Dockerfile"), []byte(dockerfile), 0644); err != nil {
|
|
| 3345 |
+ t.Fatalf("failed to open destination dockerfile: %v", err)
|
|
| 3346 |
+ } |
|
| 3347 |
+ return &FakeContext{Dir: tmpDir}
|
|
| 3348 |
+ }() |
|
| 3349 |
+ |
|
| 3350 |
+ defer ctx.Close() |
|
| 3351 |
+ |
|
| 3352 |
+ if _, err := buildImageFromContext(name, ctx, true); err != nil {
|
|
| 3353 |
+ t.Fatalf("build failed to complete for TestBuildAddTarXz: %v", err)
|
|
| 3354 |
+ } |
|
| 3355 |
+ |
|
| 3356 |
+ logDone("build - ADD tar.xz")
|
|
| 3357 |
+} |
|
| 3358 |
+ |
|
| 3359 |
+func TestBuildAddTarXzGz(t *testing.T) {
|
|
| 3360 |
+ name := "testbuildaddtarxzgz" |
|
| 3361 |
+ defer deleteImages(name) |
|
| 3362 |
+ |
|
| 3363 |
+ ctx := func() *FakeContext {
|
|
| 3364 |
+ dockerfile := ` |
|
| 3365 |
+ FROM busybox |
|
| 3366 |
+ ADD test.tar.xz.gz / |
|
| 3367 |
+ RUN ls /test.tar.xz.gz` |
|
| 3368 |
+ tmpDir, err := ioutil.TempDir("", "fake-context")
|
|
| 3369 |
+ testTar, err := os.Create(filepath.Join(tmpDir, "test.tar")) |
|
| 3370 |
+ if err != nil {
|
|
| 3371 |
+ t.Fatalf("failed to create test.tar archive: %v", err)
|
|
| 3372 |
+ } |
|
| 3373 |
+ defer testTar.Close() |
|
| 3374 |
+ |
|
| 3375 |
+ tw := tar.NewWriter(testTar) |
|
| 3376 |
+ |
|
| 3377 |
+ if err := tw.WriteHeader(&tar.Header{
|
|
| 3378 |
+ Name: "test/foo", |
|
| 3379 |
+ Size: 2, |
|
| 3380 |
+ }); err != nil {
|
|
| 3381 |
+ t.Fatalf("failed to write tar file header: %v", err)
|
|
| 3382 |
+ } |
|
| 3383 |
+ if _, err := tw.Write([]byte("Hi")); err != nil {
|
|
| 3384 |
+ t.Fatalf("failed to write tar file content: %v", err)
|
|
| 3385 |
+ } |
|
| 3386 |
+ if err := tw.Close(); err != nil {
|
|
| 3387 |
+ t.Fatalf("failed to close tar archive: %v", err)
|
|
| 3388 |
+ } |
|
| 3389 |
+ |
|
| 3390 |
+ xzCompressCmd := exec.Command("xz", "test.tar")
|
|
| 3391 |
+ xzCompressCmd.Dir = tmpDir |
|
| 3392 |
+ out, _, err := runCommandWithOutput(xzCompressCmd) |
|
| 3393 |
+ if err != nil {
|
|
| 3394 |
+ t.Fatal(err, out) |
|
| 3395 |
+ } |
|
| 3396 |
+ |
|
| 3397 |
+ gzipCompressCmd := exec.Command("gzip", "test.tar.xz")
|
|
| 3398 |
+ gzipCompressCmd.Dir = tmpDir |
|
| 3399 |
+ out, _, err = runCommandWithOutput(gzipCompressCmd) |
|
| 3400 |
+ if err != nil {
|
|
| 3401 |
+ t.Fatal(err, out) |
|
| 3402 |
+ } |
|
| 3403 |
+ |
|
| 3404 |
+ if err := ioutil.WriteFile(filepath.Join(tmpDir, "Dockerfile"), []byte(dockerfile), 0644); err != nil {
|
|
| 3405 |
+ t.Fatalf("failed to open destination dockerfile: %v", err)
|
|
| 3406 |
+ } |
|
| 3407 |
+ return &FakeContext{Dir: tmpDir}
|
|
| 3408 |
+ }() |
|
| 3409 |
+ |
|
| 3410 |
+ defer ctx.Close() |
|
| 3411 |
+ |
|
| 3412 |
+ if _, err := buildImageFromContext(name, ctx, true); err != nil {
|
|
| 3413 |
+ t.Fatalf("build failed to complete for TestBuildAddTarXz: %v", err)
|
|
| 3414 |
+ } |
|
| 3415 |
+ |
|
| 3416 |
+ logDone("build - ADD tar.xz.gz")
|
|
| 3417 |
+} |
|
| 3418 |
+ |
|
| 3307 | 3419 |
func TestBuildFromGIT(t *testing.T) {
|
| 3308 | 3420 |
name := "testbuildfromgit" |
| 3309 | 3421 |
defer deleteImages(name) |
| ... | ... |
@@ -104,6 +104,140 @@ func TestSaveAndLoadRepoStdout(t *testing.T) {
|
| 104 | 104 |
logDone("save - do not save to a tty")
|
| 105 | 105 |
} |
| 106 | 106 |
|
| 107 |
+// save a repo using gz compression and try to load it using stdout |
|
| 108 |
+func TestSaveXzAndLoadRepoStdout(t *testing.T) {
|
|
| 109 |
+ tempDir, err := ioutil.TempDir("", "test-save-xz-gz-load-repo-stdout")
|
|
| 110 |
+ if err != nil {
|
|
| 111 |
+ t.Fatal(err) |
|
| 112 |
+ } |
|
| 113 |
+ defer os.RemoveAll(tempDir) |
|
| 114 |
+ |
|
| 115 |
+ tarballPath := filepath.Join(tempDir, "foobar-save-load-test.tar.xz.gz") |
|
| 116 |
+ |
|
| 117 |
+ runCmd := exec.Command(dockerBinary, "run", "-d", "busybox", "true") |
|
| 118 |
+ out, _, err := runCommandWithOutput(runCmd) |
|
| 119 |
+ if err != nil {
|
|
| 120 |
+ t.Fatalf("failed to create a container: %v %v", out, err)
|
|
| 121 |
+ } |
|
| 122 |
+ |
|
| 123 |
+ cleanedContainerID := stripTrailingCharacters(out) |
|
| 124 |
+ |
|
| 125 |
+ repoName := "foobar-save-load-test-xz-gz" |
|
| 126 |
+ |
|
| 127 |
+ inspectCmd := exec.Command(dockerBinary, "inspect", cleanedContainerID) |
|
| 128 |
+ out, _, err = runCommandWithOutput(inspectCmd) |
|
| 129 |
+ if err != nil {
|
|
| 130 |
+ t.Fatalf("output should've been a container id: %v %v", cleanedContainerID, err)
|
|
| 131 |
+ } |
|
| 132 |
+ |
|
| 133 |
+ commitCmd := exec.Command(dockerBinary, "commit", cleanedContainerID, repoName) |
|
| 134 |
+ out, _, err = runCommandWithOutput(commitCmd) |
|
| 135 |
+ if err != nil {
|
|
| 136 |
+ t.Fatalf("failed to commit container: %v %v", out, err)
|
|
| 137 |
+ } |
|
| 138 |
+ |
|
| 139 |
+ inspectCmd = exec.Command(dockerBinary, "inspect", repoName) |
|
| 140 |
+ before, _, err := runCommandWithOutput(inspectCmd) |
|
| 141 |
+ if err != nil {
|
|
| 142 |
+ t.Fatalf("the repo should exist before saving it: %v %v", before, err)
|
|
| 143 |
+ } |
|
| 144 |
+ |
|
| 145 |
+ saveCmdTemplate := `%v save %v | xz -c | gzip -c > %s` |
|
| 146 |
+ saveCmdFinal := fmt.Sprintf(saveCmdTemplate, dockerBinary, repoName, tarballPath) |
|
| 147 |
+ saveCmd := exec.Command("bash", "-c", saveCmdFinal)
|
|
| 148 |
+ out, _, err = runCommandWithOutput(saveCmd) |
|
| 149 |
+ if err != nil {
|
|
| 150 |
+ t.Fatalf("failed to save repo: %v %v", out, err)
|
|
| 151 |
+ } |
|
| 152 |
+ |
|
| 153 |
+ deleteImages(repoName) |
|
| 154 |
+ |
|
| 155 |
+ loadCmdFinal := fmt.Sprintf(`cat %s | docker load`, tarballPath) |
|
| 156 |
+ loadCmd := exec.Command("bash", "-c", loadCmdFinal)
|
|
| 157 |
+ out, _, err = runCommandWithOutput(loadCmd) |
|
| 158 |
+ if err == nil {
|
|
| 159 |
+ t.Fatalf("expected error, but succeeded with no error and output: %v", out)
|
|
| 160 |
+ } |
|
| 161 |
+ |
|
| 162 |
+ inspectCmd = exec.Command(dockerBinary, "inspect", repoName) |
|
| 163 |
+ after, _, err := runCommandWithOutput(inspectCmd) |
|
| 164 |
+ if err == nil {
|
|
| 165 |
+ t.Fatalf("the repo should not exist: %v", after)
|
|
| 166 |
+ } |
|
| 167 |
+ |
|
| 168 |
+ deleteContainer(cleanedContainerID) |
|
| 169 |
+ deleteImages(repoName) |
|
| 170 |
+ |
|
| 171 |
+ logDone("load - save a repo with xz compression & load it using stdout")
|
|
| 172 |
+} |
|
| 173 |
+ |
|
| 174 |
+// save a repo using xz+gz compression and try to load it using stdout |
|
| 175 |
+func TestSaveXzGzAndLoadRepoStdout(t *testing.T) {
|
|
| 176 |
+ tempDir, err := ioutil.TempDir("", "test-save-xz-gz-load-repo-stdout")
|
|
| 177 |
+ if err != nil {
|
|
| 178 |
+ t.Fatal(err) |
|
| 179 |
+ } |
|
| 180 |
+ defer os.RemoveAll(tempDir) |
|
| 181 |
+ |
|
| 182 |
+ tarballPath := filepath.Join(tempDir, "foobar-save-load-test.tar.xz.gz") |
|
| 183 |
+ |
|
| 184 |
+ runCmd := exec.Command(dockerBinary, "run", "-d", "busybox", "true") |
|
| 185 |
+ out, _, err := runCommandWithOutput(runCmd) |
|
| 186 |
+ if err != nil {
|
|
| 187 |
+ t.Fatalf("failed to create a container: %v %v", out, err)
|
|
| 188 |
+ } |
|
| 189 |
+ |
|
| 190 |
+ cleanedContainerID := stripTrailingCharacters(out) |
|
| 191 |
+ |
|
| 192 |
+ repoName := "foobar-save-load-test-xz-gz" |
|
| 193 |
+ |
|
| 194 |
+ inspectCmd := exec.Command(dockerBinary, "inspect", cleanedContainerID) |
|
| 195 |
+ out, _, err = runCommandWithOutput(inspectCmd) |
|
| 196 |
+ if err != nil {
|
|
| 197 |
+ t.Fatalf("output should've been a container id: %v %v", cleanedContainerID, err)
|
|
| 198 |
+ } |
|
| 199 |
+ |
|
| 200 |
+ commitCmd := exec.Command(dockerBinary, "commit", cleanedContainerID, repoName) |
|
| 201 |
+ out, _, err = runCommandWithOutput(commitCmd) |
|
| 202 |
+ if err != nil {
|
|
| 203 |
+ t.Fatalf("failed to commit container: %v %v", out, err)
|
|
| 204 |
+ } |
|
| 205 |
+ |
|
| 206 |
+ inspectCmd = exec.Command(dockerBinary, "inspect", repoName) |
|
| 207 |
+ before, _, err := runCommandWithOutput(inspectCmd) |
|
| 208 |
+ if err != nil {
|
|
| 209 |
+ t.Fatalf("the repo should exist before saving it: %v %v", before, err)
|
|
| 210 |
+ } |
|
| 211 |
+ |
|
| 212 |
+ saveCmdTemplate := `%v save %v | xz -c | gzip -c > %s` |
|
| 213 |
+ saveCmdFinal := fmt.Sprintf(saveCmdTemplate, dockerBinary, repoName, tarballPath) |
|
| 214 |
+ saveCmd := exec.Command("bash", "-c", saveCmdFinal)
|
|
| 215 |
+ out, _, err = runCommandWithOutput(saveCmd) |
|
| 216 |
+ if err != nil {
|
|
| 217 |
+ t.Fatalf("failed to save repo: %v %v", out, err)
|
|
| 218 |
+ } |
|
| 219 |
+ |
|
| 220 |
+ deleteImages(repoName) |
|
| 221 |
+ |
|
| 222 |
+ loadCmdFinal := fmt.Sprintf(`cat %s | docker load`, tarballPath) |
|
| 223 |
+ loadCmd := exec.Command("bash", "-c", loadCmdFinal)
|
|
| 224 |
+ out, _, err = runCommandWithOutput(loadCmd) |
|
| 225 |
+ if err == nil {
|
|
| 226 |
+ t.Fatalf("expected error, but succeeded with no error and output: %v", out)
|
|
| 227 |
+ } |
|
| 228 |
+ |
|
| 229 |
+ inspectCmd = exec.Command(dockerBinary, "inspect", repoName) |
|
| 230 |
+ after, _, err := runCommandWithOutput(inspectCmd) |
|
| 231 |
+ if err == nil {
|
|
| 232 |
+ t.Fatalf("the repo should not exist: %v", after)
|
|
| 233 |
+ } |
|
| 234 |
+ |
|
| 235 |
+ deleteContainer(cleanedContainerID) |
|
| 236 |
+ deleteImages(repoName) |
|
| 237 |
+ |
|
| 238 |
+ logDone("load - save a repo with xz+gz compression & load it using stdout")
|
|
| 239 |
+} |
|
| 240 |
+ |
|
| 107 | 241 |
func TestSaveSingleTag(t *testing.T) {
|
| 108 | 242 |
repoName := "foobar-save-single-tag-test" |
| 109 | 243 |
|