Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
aos
GitHub Repository: aos/firecracker
Path: blob/main/tests/integration_tests/functional/test_pause_resume.py
1958 views
1
# Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
# SPDX-License-Identifier: Apache-2.0
3
"""Basic tests scenarios for snapshot save/restore."""
4
5
import os
6
from framework.builder import MicrovmBuilder
7
from framework.resources import DescribeInstance
8
import host_tools.logging as log_tools
9
import host_tools.network as net_tools # pylint: disable=import-error
10
11
12
def verify_net_emulation_paused(metrics):
13
"""Verify net emulation is paused base on provided metrics."""
14
net_metrics = metrics['net']
15
assert net_metrics['rx_queue_event_count'] == 0
16
assert net_metrics['rx_partial_writes'] == 0
17
assert net_metrics['rx_tap_event_count'] == 0
18
assert net_metrics['rx_bytes_count'] == 0
19
assert net_metrics['rx_packets_count'] == 0
20
assert net_metrics['rx_fails'] == 0
21
assert net_metrics['rx_count'] == 0
22
assert net_metrics['tap_read_fails'] == 0
23
assert net_metrics['tap_write_fails'] == 0
24
assert net_metrics['tx_bytes_count'] == 0
25
assert net_metrics['tx_fails'] == 0
26
assert net_metrics['tx_count'] == 0
27
assert net_metrics['tx_packets_count'] == 0
28
assert net_metrics['tx_queue_event_count'] == 0
29
print(net_metrics)
30
31
32
def test_pause_resume(bin_cloner_path):
33
"""Test scenario: boot/pause/resume."""
34
builder = MicrovmBuilder(bin_cloner_path)
35
vm_instance = builder.build_vm_nano()
36
microvm = vm_instance.vm
37
38
# Pausing the microVM before being started is not allowed.
39
response = microvm.vm.patch(state='Paused')
40
assert microvm.api_session.is_status_bad_request(response.status_code)
41
42
# Resuming the microVM before being started is also not allowed.
43
response = microvm.vm.patch(state='Resumed')
44
assert microvm.api_session.is_status_bad_request(response.status_code)
45
46
# Configure metrics system and start microVM.
47
metrics_fifo_path = os.path.join(microvm.path, 'metrics_fifo')
48
metrics_fifo = log_tools.Fifo(metrics_fifo_path)
49
response = microvm.metrics.put(
50
metrics_path=microvm.create_jailed_resource(metrics_fifo.path)
51
)
52
assert microvm.api_session.is_status_no_content(response.status_code)
53
microvm.start()
54
55
ssh_connection = net_tools.SSHConnection(microvm.ssh_config)
56
57
# Verify guest is active.
58
exit_code, _, _ = ssh_connection.execute_command("ls")
59
assert exit_code == 0
60
61
# Pausing the microVM after it's been started is successful.
62
response = microvm.vm.patch(state='Paused')
63
assert microvm.api_session.is_status_no_content(response.status_code)
64
65
# Flush and reset metrics as they contain pre-pause data.
66
microvm.flush_metrics(metrics_fifo)
67
68
# Verify guest is no longer active.
69
exit_code, _, _ = ssh_connection.execute_command("ls")
70
assert exit_code != 0
71
72
# Verify emulation was indeed paused and no events from either
73
# guest or host side were handled.
74
verify_net_emulation_paused(microvm.flush_metrics(metrics_fifo))
75
76
# Verify guest is no longer active.
77
exit_code, _, _ = ssh_connection.execute_command("ls")
78
assert exit_code != 0
79
80
# Pausing the microVM when it is already `Paused` is allowed
81
# (microVM remains in `Paused` state).
82
response = microvm.vm.patch(state='Paused')
83
assert microvm.api_session.is_status_no_content(response.status_code)
84
85
# Resuming the microVM is successful.
86
response = microvm.vm.patch(state='Resumed')
87
assert microvm.api_session.is_status_no_content(response.status_code)
88
89
# Verify guest is active again.
90
exit_code, _, _ = ssh_connection.execute_command("ls")
91
assert exit_code == 0
92
93
# Resuming the microVM when it is already `Resumed` is allowed
94
# (microVM remains in the running state).
95
response = microvm.vm.patch(state='Resumed')
96
assert microvm.api_session.is_status_no_content(response.status_code)
97
98
# Verify guest is still active.
99
exit_code, _, _ = ssh_connection.execute_command("ls")
100
assert exit_code == 0
101
102
microvm.kill()
103
104
105
def test_describe_instance(bin_cloner_path):
106
"""Test scenario: DescribeInstance different states."""
107
builder = MicrovmBuilder(bin_cloner_path)
108
vm_instance = builder.build_vm_nano()
109
microvm = vm_instance.vm
110
descr_inst = DescribeInstance(microvm.api_socket, microvm.api_session)
111
112
# Check MicroVM state is "Not started"
113
response = descr_inst.get()
114
assert microvm.api_session.is_status_ok(response.status_code)
115
assert "Not started" in response.text
116
117
# Start MicroVM
118
microvm.start()
119
120
# Check MicroVM state is "Running"
121
response = descr_inst.get()
122
assert microvm.api_session.is_status_ok(response.status_code)
123
assert "Running" in response.text
124
125
# Pause MicroVM
126
response = microvm.vm.patch(state='Paused')
127
assert microvm.api_session.is_status_no_content(response.status_code)
128
129
# Check MicroVM state is "Paused"
130
response = descr_inst.get()
131
assert microvm.api_session.is_status_ok(response.status_code)
132
assert "Paused" in response.text
133
134
# Resume MicroVM
135
response = microvm.vm.patch(state='Resumed')
136
assert microvm.api_session.is_status_no_content(response.status_code)
137
138
# Check MicroVM state is "Running" after VM is resumed
139
response = descr_inst.get()
140
assert microvm.api_session.is_status_ok(response.status_code)
141
assert "Running" in response.text
142
143
microvm.kill()
144
145