|
72 | 72 | testBalloonDeflateOnOom = true
|
73 | 73 | testStatsPollingIntervals = int64(1)
|
74 | 74 | testNewStatsPollingIntervals = int64(6)
|
| 75 | + |
| 76 | + // How long to wait for the socket to appear. |
| 77 | + firecrackerSocketWait = int64(10) |
75 | 78 | )
|
76 | 79 |
|
77 | 80 | func envOrDefault(k, empty string) string {
|
@@ -1729,6 +1732,76 @@ func TestCreateSnapshot(t *testing.T) {
|
1729 | 1732 | }
|
1730 | 1733 | }
|
1731 | 1734 |
|
| 1735 | +func TestLoadSnapshot(t *testing.T) { |
| 1736 | + fctesting.RequiresKVM(t) |
| 1737 | + fctesting.RequiresRoot(t) |
| 1738 | + |
| 1739 | + ctx := context.Background() |
| 1740 | + |
| 1741 | + dir, err := ioutil.TempDir("", t.Name()) |
| 1742 | + require.NoError(t, err) |
| 1743 | + defer os.RemoveAll(dir) |
| 1744 | + |
| 1745 | + // Set snap and mem paths |
| 1746 | + socketPath := filepath.Join(dir, fsSafeTestName.Replace(t.Name())) |
| 1747 | + snapPath := socketPath + "SnapFile" |
| 1748 | + memPath := socketPath + "MemFile" |
| 1749 | + defer os.Remove(socketPath) |
| 1750 | + defer os.Remove(snapPath) |
| 1751 | + defer os.Remove(memPath) |
| 1752 | + |
| 1753 | + // Tee logs for validation: |
| 1754 | + var logBuffer bytes.Buffer |
| 1755 | + machineLogger := logrus.New() |
| 1756 | + machineLogger.Out = io.MultiWriter(os.Stderr, &logBuffer) |
| 1757 | + |
| 1758 | + // Create a snapshot |
| 1759 | + { |
| 1760 | + cfg := createValidConfig(t, socketPath+".create") |
| 1761 | + m, err := NewMachine(ctx, cfg, func(m *Machine) { |
| 1762 | + // Rewriting m.cmd partially wouldn't work since Cmd has |
| 1763 | + // some unexported members |
| 1764 | + args := m.cmd.Args[1:] |
| 1765 | + m.cmd = exec.Command(getFirecrackerBinaryPath(), args...) |
| 1766 | + }, WithLogger(logrus.NewEntry(machineLogger))) |
| 1767 | + require.NoError(t, err) |
| 1768 | + |
| 1769 | + err = m.Start(ctx) |
| 1770 | + require.NoError(t, err) |
| 1771 | + |
| 1772 | + err = m.PauseVM(ctx) |
| 1773 | + require.NoError(t, err) |
| 1774 | + |
| 1775 | + err = m.CreateSnapshot(ctx, memPath, snapPath) |
| 1776 | + require.NoError(t, err) |
| 1777 | + |
| 1778 | + err = m.StopVMM() |
| 1779 | + require.NoError(t, err) |
| 1780 | + } |
| 1781 | + |
| 1782 | + // Load a snapshot |
| 1783 | + { |
| 1784 | + cfg := createValidConfig(t, socketPath+".load") |
| 1785 | + m, err := NewMachine(ctx, cfg, func(m *Machine) { |
| 1786 | + // Rewriting m.cmd partially wouldn't work since Cmd has |
| 1787 | + // some unexported members |
| 1788 | + args := m.cmd.Args[1:] |
| 1789 | + m.cmd = exec.Command(getFirecrackerBinaryPath(), args...) |
| 1790 | + }, WithLogger(logrus.NewEntry(machineLogger))) |
| 1791 | + require.NoError(t, err) |
| 1792 | + |
| 1793 | + err = m.Start(ctx, WithSnapshot(ctx, memPath, snapPath)) |
| 1794 | + require.NoError(t, err) |
| 1795 | + |
| 1796 | + err = m.ResumeVM(ctx) |
| 1797 | + require.NoError(t, err) |
| 1798 | + |
| 1799 | + err = m.StopVMM() |
| 1800 | + require.NoError(t, err) |
| 1801 | + } |
| 1802 | + |
| 1803 | +} |
| 1804 | + |
1732 | 1805 | func testCreateBalloon(ctx context.Context, t *testing.T, m *Machine) {
|
1733 | 1806 | if err := m.CreateBalloon(ctx, testBalloonMemory, testBalloonDeflateOnOom, testStatsPollingIntervals); err != nil {
|
1734 | 1807 | t.Errorf("Create balloon device failed from testAttachBalloon: %s", err)
|
|
0 commit comments