Files
inecs cbd0adca91 Initial release of the oVirt/RHV Engine API simulator.
Stateful FastAPI lab with contract packs, Compose/Helm, Docker Hub release
targets, and Pulumi coverage across all Engine series (GET/POST/PUT/DELETE/HEAD).
2026-07-18 04:49:28 +03:00

203 lines
6.4 KiB
Python

"""Integration tests against the running Compose Engine gateway + PostgreSQL."""
from __future__ import annotations
import base64
import pytest
import requests
from .conftest import collection_items, oauth_token
pytestmark = pytest.mark.integration
def test_oauth_and_basic_auth(base_url: str) -> None:
token = oauth_token(base_url)
r = requests.get(
f"{base_url}/ovirt-engine/api",
headers={"Authorization": f"Bearer {token}", "Accept": "application/json", "Version": "4"},
verify=False,
timeout=60,
)
assert r.status_code == 200
body = r.json()
assert "api" in body or "product_info" in body
basic = base64.b64encode(b"admin@internal:secret").decode()
r2 = requests.get(
f"{base_url}/ovirt-engine/api/vms",
headers={"Authorization": f"Basic {basic}", "Accept": "application/json"},
verify=False,
timeout=60,
)
assert r2.status_code == 200
assert len(collection_items(r2.json(), "vm")) >= 1
def test_vm_lifecycle_and_disk(base_url: str) -> None:
token = oauth_token(base_url)
h = {
"Authorization": f"Bearer {token}",
"Accept": "application/json",
"Content-Type": "application/json",
}
clusters = requests.get(f"{base_url}/ovirt-engine/api/clusters", headers=h, verify=False, timeout=60)
assert clusters.status_code == 200
cluster = clusters.json()["cluster"]
cluster_id = cluster[0]["id"] if isinstance(cluster, list) else cluster["id"]
create = requests.post(
f"{base_url}/ovirt-engine/api/vms",
headers=h,
json={"vm": {"name": "itest-vm-1", "cluster": {"id": cluster_id}, "memory": 1073741824}},
verify=False,
timeout=60,
)
assert create.status_code == 201, create.text
vm_id = create.json()["vm"]["id"]
upd = requests.put(
f"{base_url}/ovirt-engine/api/vms/{vm_id}",
headers=h,
json={"vm": {"name": "itest-vm-1b", "memory": 2147483648}},
verify=False,
timeout=60,
)
assert upd.status_code == 200
assert upd.json()["vm"]["name"] == "itest-vm-1b"
start = requests.post(
f"{base_url}/ovirt-engine/api/vms/{vm_id}/start",
headers=h,
json={"action": {}},
verify=False,
timeout=60,
)
assert start.status_code == 200
disk = requests.post(
f"{base_url}/ovirt-engine/api/disks",
headers=h,
json={"disk": {"name": "itest-disk", "provisioned_size": 10737418240}},
verify=False,
timeout=60,
)
assert disk.status_code == 201, disk.text
disk_id = disk.json()["disk"]["id"]
expand = requests.put(
f"{base_url}/ovirt-engine/api/disks/{disk_id}",
headers=h,
json={"disk": {"provisioned_size": 21474836480}},
verify=False,
timeout=60,
)
assert expand.status_code == 200
attach = requests.post(
f"{base_url}/ovirt-engine/api/vms/{vm_id}/diskattachments",
headers=h,
json={"disk_attachment": {"disk": {"id": disk_id}, "interface": "virtio_scsi"}},
verify=False,
timeout=60,
)
assert attach.status_code == 201
nic = requests.post(
f"{base_url}/ovirt-engine/api/vms/{vm_id}/nics",
headers=h,
json={"nic": {"name": "nic1", "interface": "virtio"}},
verify=False,
timeout=60,
)
assert nic.status_code == 201
stop = requests.post(
f"{base_url}/ovirt-engine/api/vms/{vm_id}/stop",
headers=h,
json={"action": {}},
verify=False,
timeout=60,
)
assert stop.status_code == 200
requests.delete(f"{base_url}/ovirt-engine/api/disks/{disk_id}", headers=h, verify=False, timeout=60)
delete = requests.delete(
f"{base_url}/ovirt-engine/api/vms/{vm_id}", headers=h, verify=False, timeout=60
)
assert delete.status_code == 200
def test_inventory_collections(base_url: str) -> None:
token = oauth_token(base_url)
h = {"Authorization": f"Bearer {token}", "Accept": "application/json"}
expected = {
"/ovirt-engine/api/datacenters": "data_center",
"/ovirt-engine/api/clusters": "cluster",
"/ovirt-engine/api/hosts": "host",
"/ovirt-engine/api/storagedomains": "storage_domain",
"/ovirt-engine/api/networks": "network",
"/ovirt-engine/api/vnicprofiles": "vnic_profile",
"/ovirt-engine/api/templates": "template",
"/ovirt-engine/api/users": "user",
"/ovirt-engine/api/roles": "role",
"/ovirt-engine/api/domains": "domain",
"/ovirt-engine/api/permissions": "permission",
"/ovirt-engine/api/events": "event",
"/ovirt-engine/api/jobs": "job",
"/ovirt-engine/api/tags": "tag",
"/ovirt-engine/api/bookmarks": "bookmark",
"/ovirt-engine/api/groups": "group",
"/ovirt-engine/api/instancetypes": "instance_type",
"/ovirt-engine/api/macpools": "mac_pool",
"/ovirt-engine/api/schedulingpolicies": "scheduling_policy",
}
for path, element in expected.items():
r = requests.get(f"{base_url}{path}", headers=h, verify=False, timeout=60)
assert r.status_code == 200, path
assert len(collection_items(r.json(), element)) >= 1, f"{path} empty"
def test_xml_accept_and_v4_prefix(base_url: str) -> None:
token = oauth_token(base_url)
r = requests.get(
f"{base_url}/ovirt-engine/api/v4/vms",
headers={"Authorization": f"Bearer {token}", "Accept": "application/xml"},
verify=False,
timeout=60,
)
assert r.status_code == 200
assert "<vms" in r.text or "<vm" in r.text
def test_series_hot_swap(base_url: str) -> None:
r = requests.post(
f"{base_url}/ui/api/ovirt/contracts/activate",
json={"series": "3.6"},
verify=False,
timeout=60,
)
assert r.status_code == 200
assert r.json()["series"] == "3.6"
token = oauth_token(base_url)
vms = requests.get(
f"{base_url}/ovirt-engine/api/v3/vms",
headers={
"Authorization": f"Bearer {token}",
"Accept": "application/json",
"Version": "3",
},
verify=False,
timeout=60,
)
assert vms.status_code == 200
assert len(collection_items(vms.json(), "vm")) >= 1
r2 = requests.post(
f"{base_url}/ui/api/ovirt/contracts/activate",
json={"series": "4.5"},
verify=False,
timeout=60,
)
assert r2.status_code == 200