// Size returns the size of the rootfs for the provided id. It is a relatively // expensive operation, it goes through all the files and adds up their size. func (ts *TreeStore) Size(id string) (int64, error) { sz, err := fileutil.DirSize(ts.GetPath(id)) if err != nil { return -1, errwrap.Wrap(errors.New("error calculating size"), err) } return sz, nil }
// Size returns the size of the rootfs for the provided id. It is a relatively // expensive operation, it goes through all the files and adds up their size. func (ts *TreeStore) Size(id string) (int64, error) { sz, err := fileutil.DirSize(ts.GetPath(id)) if err != nil { return -1, fmt.Errorf("treestore: error calculating size: %v", err) } return sz, nil }
func TestImageSize(t *testing.T) { ctx := testutils.NewRktRunCtx() defer ctx.Cleanup() image := patchTestACI("rkt-size.aci", "--no-compression", "--name=size-test") defer os.Remove(image) imageHash := "sha512-" + getHashOrPanic(image)[:64] fi, err := os.Stat(image) if err != nil { t.Fatalf("cannot stat image %q: %v", image, err) } imageSize := fi.Size() fetchCmd := fmt.Sprintf("%s --insecure-options=image fetch %s", ctx.Cmd(), image) spawnAndWaitOrFail(t, fetchCmd, 0) imageListCmd := fmt.Sprintf("%s image list --no-legend --full", ctx.Cmd()) // if we don't support overlay fs, we don't render the image on fetch if !common.SupportsOverlay() { // check that the printed size is the same as the actual image size expectedStr := fmt.Sprintf("(?s)%s.*%d.*", imageHash, imageSize) runRktAndCheckRegexOutput(t, imageListCmd, expectedStr) // run the image, so rkt renders it in the tree store runCmd := fmt.Sprintf("%s --insecure-options=image run %s", ctx.Cmd(), image) spawnAndWaitOrFail(t, runCmd, 0) } tmpDir := createTempDirOrPanic("rkt_image_list_test") defer os.RemoveAll(tmpDir) imageRenderCmd := fmt.Sprintf("%s image render --overwrite %s %s", ctx.Cmd(), imageHash, tmpDir) spawnAndWaitOrFail(t, imageRenderCmd, 0) /* recreate the tree store directory contents to get an accurate size: - hash file - image file - rendered file NOTE: if/when we add new files to the tree store directory, this test will fail and will need an update. */ if err := ioutil.WriteFile(filepath.Join(tmpDir, "hash"), []byte(imageHash), 0600); err != nil { t.Fatalf(`error writing "hash" file: %v`, err) } if err := ioutil.WriteFile(filepath.Join(tmpDir, "image"), []byte(imageHash), 0600); err != nil { t.Fatalf(`error writing "image" file: %v`, err) } if err := ioutil.WriteFile(filepath.Join(tmpDir, "rendered"), []byte{}, 0600); err != nil { t.Fatalf(`error writing "rendered" file: %v`, err) } tsSize, err := fileutil.DirSize(tmpDir) if err != nil { t.Fatalf("error calculating rendered size: %v", err) } // check the size with the rendered image expectedStr := fmt.Sprintf("(?s)%s.*%d.*", imageHash, imageSize+tsSize) runRktAndCheckRegexOutput(t, imageListCmd, expectedStr) // gc the pod gcCmd := fmt.Sprintf("%s gc --grace-period=0s", ctx.Cmd()) spawnAndWaitOrFail(t, gcCmd, 0) // image gc to remove the tree store imageGCCmd := fmt.Sprintf("%s image gc", ctx.Cmd()) spawnAndWaitOrFail(t, imageGCCmd, 0) // check that the size goes back to the original (only the image size) expectedStr = fmt.Sprintf("(?s)%s.*%d.*", imageHash, imageSize) runRktAndCheckRegexOutput(t, imageListCmd, expectedStr) }