|
86 | 86 | kernel_interface, |
87 | 87 | logging_manager, |
88 | 88 | utils_disk, |
| 89 | + utils_linux_modules, |
89 | 90 | utils_logfile, |
90 | 91 | utils_selinux, |
91 | 92 | ) |
@@ -4705,3 +4706,97 @@ def _md5(fd): |
4705 | 4706 | if _md5(fd_a) == _md5(fd_b): |
4706 | 4707 | return True |
4707 | 4708 | return False |
| 4709 | + |
| 4710 | + |
| 4711 | +def verify_secure_host(secure_guest_type, module_name, param_name, expected_values): |
| 4712 | + """ |
| 4713 | + Verify if specific cvm feature is enabled on the host |
| 4714 | +
|
| 4715 | + :param secure_guest_type: Type of secure guest (e.g., 'sev', 'snp', 'tdx') |
| 4716 | + :param module_name: Name of the kernel module (e.g., 'kvm_amd', 'kvm_intel') |
| 4717 | + :param param_name: Name of the module parameter to check (e.g., 'sev', 'tdx') |
| 4718 | + :param expected_values: List of acceptable parameter values (e.g., ['Y', '1']) |
| 4719 | + """ |
| 4720 | + LOG.info(f"Verifying cvm {secure_guest_type} capability enablement on host") |
| 4721 | + |
| 4722 | + param_value = utils_linux_modules.get_module_parameter(module_name, param_name) |
| 4723 | + |
| 4724 | + if param_value is None: |
| 4725 | + raise exceptions.TestCancel( |
| 4726 | + f"Host support for {secure_guest_type} capability: " |
| 4727 | + f"module parameter {module_name}/{param_name} not found." |
| 4728 | + ) |
| 4729 | + |
| 4730 | + if param_value not in expected_values: |
| 4731 | + raise exceptions.TestCancel( |
| 4732 | + f"Host support for {secure_guest_type} capability check failed: " |
| 4733 | + f"{module_name}/{param_name}={param_value}, expected one of {expected_values}" |
| 4734 | + ) |
| 4735 | + |
| 4736 | + |
| 4737 | +def verify_secure_guest( |
| 4738 | + session, vm, secure_guest_type, guest_check_cmd, expected_policy=None |
| 4739 | +): |
| 4740 | + """ |
| 4741 | + Verify if specific cvm feature is enabled inside the VM |
| 4742 | +
|
| 4743 | + :param session: session object to vm |
| 4744 | + :param vm: virtual machine object |
| 4745 | + :param secure_guest_type: Type of secure guest (e.g., 'sev', 'snp', 'tdx') |
| 4746 | + :param guest_check_cmd: Command to run in guest to verify CVM capability |
| 4747 | + :param expected_policy: Expected policy value (can be hex string or int), optional for AMD CVM |
| 4748 | + """ |
| 4749 | + amd_cvm_secureguest = ["sev", "snp"] |
| 4750 | + if secure_guest_type in amd_cvm_secureguest: |
| 4751 | + try: |
| 4752 | + cvm_guest_info = vm.monitor.query_sev() |
| 4753 | + if not cvm_guest_info: |
| 4754 | + raise exceptions.TestFail("QMP query-sev returned empty response.") |
| 4755 | + LOG.info(f"QMP cvm info: {cvm_guest_info}") |
| 4756 | + except Exception as e: |
| 4757 | + raise exceptions.TestFail(f"QMP query-sev failed: {str(e)}") |
| 4758 | + |
| 4759 | + if expected_policy is not None: |
| 4760 | + if isinstance(expected_policy, str): |
| 4761 | + policy_value = int(expected_policy, 0) |
| 4762 | + else: |
| 4763 | + policy_value = expected_policy |
| 4764 | + |
| 4765 | + if secure_guest_type == "snp": |
| 4766 | + if "snp-policy" not in cvm_guest_info: |
| 4767 | + raise exceptions.TestFail( |
| 4768 | + "QMP snp-policy not found in query-sev response." |
| 4769 | + ) |
| 4770 | + actual_policy = cvm_guest_info["snp-policy"] |
| 4771 | + else: |
| 4772 | + if "policy" not in cvm_guest_info: |
| 4773 | + raise exceptions.TestFail( |
| 4774 | + "QMP policy not found in query-sev response." |
| 4775 | + ) |
| 4776 | + actual_policy = cvm_guest_info["policy"] |
| 4777 | + |
| 4778 | + if actual_policy != policy_value: |
| 4779 | + raise exceptions.TestFail( |
| 4780 | + f"QMP cvm policy mismatch: expected {policy_value}, " |
| 4781 | + f"got {actual_policy}" |
| 4782 | + ) |
| 4783 | + |
| 4784 | + guest_state = cvm_guest_info.get("state") |
| 4785 | + if guest_state != "running": |
| 4786 | + raise exceptions.TestFail( |
| 4787 | + f"CVM state is {guest_state or 'missing'}, expected 'running'" |
| 4788 | + ) |
| 4789 | + |
| 4790 | + LOG.info(f"Verifying cvm {secure_guest_type} capability enablement in guest") |
| 4791 | + try: |
| 4792 | + return_code, output = session.cmd_status_output(guest_check_cmd, timeout=240) |
| 4793 | + if return_code != 0: |
| 4794 | + raise exceptions.TestFail( |
| 4795 | + f"Guest cvm {secure_guest_type} capability check failed with " |
| 4796 | + f"return code {return_code}: {output}" |
| 4797 | + ) |
| 4798 | + LOG.info(f"Guest cvm {secure_guest_type} capability check output: {output}") |
| 4799 | + except Exception as e: |
| 4800 | + raise exceptions.TestFail( |
| 4801 | + f"Guest cvm {secure_guest_type} capability verify fail: {str(e)}" |
| 4802 | + ) |
0 commit comments