Path: blob/main/tests/integration_tests/functional/test_pause_resume.py
1958 views
# Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.1# SPDX-License-Identifier: Apache-2.02"""Basic tests scenarios for snapshot save/restore."""34import os5from framework.builder import MicrovmBuilder6from framework.resources import DescribeInstance7import host_tools.logging as log_tools8import host_tools.network as net_tools # pylint: disable=import-error91011def verify_net_emulation_paused(metrics):12"""Verify net emulation is paused base on provided metrics."""13net_metrics = metrics['net']14assert net_metrics['rx_queue_event_count'] == 015assert net_metrics['rx_partial_writes'] == 016assert net_metrics['rx_tap_event_count'] == 017assert net_metrics['rx_bytes_count'] == 018assert net_metrics['rx_packets_count'] == 019assert net_metrics['rx_fails'] == 020assert net_metrics['rx_count'] == 021assert net_metrics['tap_read_fails'] == 022assert net_metrics['tap_write_fails'] == 023assert net_metrics['tx_bytes_count'] == 024assert net_metrics['tx_fails'] == 025assert net_metrics['tx_count'] == 026assert net_metrics['tx_packets_count'] == 027assert net_metrics['tx_queue_event_count'] == 028print(net_metrics)293031def test_pause_resume(bin_cloner_path):32"""Test scenario: boot/pause/resume."""33builder = MicrovmBuilder(bin_cloner_path)34vm_instance = builder.build_vm_nano()35microvm = vm_instance.vm3637# Pausing the microVM before being started is not allowed.38response = microvm.vm.patch(state='Paused')39assert microvm.api_session.is_status_bad_request(response.status_code)4041# Resuming the microVM before being started is also not allowed.42response = microvm.vm.patch(state='Resumed')43assert microvm.api_session.is_status_bad_request(response.status_code)4445# Configure metrics system and start microVM.46metrics_fifo_path = os.path.join(microvm.path, 'metrics_fifo')47metrics_fifo = log_tools.Fifo(metrics_fifo_path)48response = microvm.metrics.put(49metrics_path=microvm.create_jailed_resource(metrics_fifo.path)50)51assert microvm.api_session.is_status_no_content(response.status_code)52microvm.start()5354ssh_connection = net_tools.SSHConnection(microvm.ssh_config)5556# Verify guest is active.57exit_code, _, _ = ssh_connection.execute_command("ls")58assert exit_code == 05960# Pausing the microVM after it's been started is successful.61response = microvm.vm.patch(state='Paused')62assert microvm.api_session.is_status_no_content(response.status_code)6364# Flush and reset metrics as they contain pre-pause data.65microvm.flush_metrics(metrics_fifo)6667# Verify guest is no longer active.68exit_code, _, _ = ssh_connection.execute_command("ls")69assert exit_code != 07071# Verify emulation was indeed paused and no events from either72# guest or host side were handled.73verify_net_emulation_paused(microvm.flush_metrics(metrics_fifo))7475# Verify guest is no longer active.76exit_code, _, _ = ssh_connection.execute_command("ls")77assert exit_code != 07879# Pausing the microVM when it is already `Paused` is allowed80# (microVM remains in `Paused` state).81response = microvm.vm.patch(state='Paused')82assert microvm.api_session.is_status_no_content(response.status_code)8384# Resuming the microVM is successful.85response = microvm.vm.patch(state='Resumed')86assert microvm.api_session.is_status_no_content(response.status_code)8788# Verify guest is active again.89exit_code, _, _ = ssh_connection.execute_command("ls")90assert exit_code == 09192# Resuming the microVM when it is already `Resumed` is allowed93# (microVM remains in the running state).94response = microvm.vm.patch(state='Resumed')95assert microvm.api_session.is_status_no_content(response.status_code)9697# Verify guest is still active.98exit_code, _, _ = ssh_connection.execute_command("ls")99assert exit_code == 0100101microvm.kill()102103104def test_describe_instance(bin_cloner_path):105"""Test scenario: DescribeInstance different states."""106builder = MicrovmBuilder(bin_cloner_path)107vm_instance = builder.build_vm_nano()108microvm = vm_instance.vm109descr_inst = DescribeInstance(microvm.api_socket, microvm.api_session)110111# Check MicroVM state is "Not started"112response = descr_inst.get()113assert microvm.api_session.is_status_ok(response.status_code)114assert "Not started" in response.text115116# Start MicroVM117microvm.start()118119# Check MicroVM state is "Running"120response = descr_inst.get()121assert microvm.api_session.is_status_ok(response.status_code)122assert "Running" in response.text123124# Pause MicroVM125response = microvm.vm.patch(state='Paused')126assert microvm.api_session.is_status_no_content(response.status_code)127128# Check MicroVM state is "Paused"129response = descr_inst.get()130assert microvm.api_session.is_status_ok(response.status_code)131assert "Paused" in response.text132133# Resume MicroVM134response = microvm.vm.patch(state='Resumed')135assert microvm.api_session.is_status_no_content(response.status_code)136137# Check MicroVM state is "Running" after VM is resumed138response = descr_inst.get()139assert microvm.api_session.is_status_ok(response.status_code)140assert "Running" in response.text141142microvm.kill()143144145