cbd0adca91
Stateful FastAPI lab with contract packs, Compose/Helm, Docker Hub release targets, and Pulumi coverage across all Engine series (GET/POST/PUT/DELETE/HEAD).
152 lines
5.2 KiB
Python
152 lines
5.2 KiB
Python
"""Surface probe: GET/POST/PUT/DELETE happy paths across Engine collections."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import uuid
|
|
|
|
import pytest
|
|
import requests
|
|
|
|
from .conftest import auth_headers, collection_items, discover_base_url, oauth_token
|
|
|
|
pytestmark = pytest.mark.integration
|
|
|
|
|
|
@pytest.fixture(scope="module")
|
|
def session_ctx():
|
|
base = discover_base_url()
|
|
token = oauth_token(base)
|
|
return base, auth_headers(token, version="4")
|
|
|
|
|
|
def test_get_all_top_level_collections(session_ctx) -> None:
|
|
base, headers = session_ctx
|
|
collections = {
|
|
"datacenters": "data_center",
|
|
"clusters": "cluster",
|
|
"hosts": "host",
|
|
"vms": "vm",
|
|
"disks": "disk",
|
|
"networks": "network",
|
|
"vnicprofiles": "vnic_profile",
|
|
"storagedomains": "storage_domain",
|
|
"storageconnections": "storage_connection",
|
|
"templates": "template",
|
|
"users": "user",
|
|
"groups": "group",
|
|
"roles": "role",
|
|
"events": "event",
|
|
"jobs": "job",
|
|
"tags": "tag",
|
|
"bookmarks": "bookmark",
|
|
"instancetypes": "instance_type",
|
|
"macpools": "mac_pool",
|
|
"schedulingpolicies": "scheduling_policy",
|
|
"schedulingpolicyunits": "scheduling_policy_unit",
|
|
"clusterlevels": "cluster_level",
|
|
"icons": "icon",
|
|
"operatingsystems": "operating_system",
|
|
"networkfilters": "network_filter",
|
|
"vmpools": "vm_pool",
|
|
"affinitylabels": "affinity_label",
|
|
"permissions": "permission",
|
|
"domains": "domain",
|
|
"options": "engine_option",
|
|
"imagetransfers": "image_transfer",
|
|
"katelloerrata": "katello_erratum",
|
|
"externalhostproviders": "external_host_provider",
|
|
"openstacknetworkproviders": "openstack_network_provider",
|
|
"openstackimageproviders": "openstack_image_provider",
|
|
"openstackvolumeproviders": "openstack_volume_provider",
|
|
}
|
|
for name, element in collections.items():
|
|
r = requests.get(f"{base}/ovirt-engine/api/{name}", headers=headers, verify=False, timeout=60)
|
|
assert r.status_code == 200, f"{name}: {r.status_code} {r.text[:200]}"
|
|
items = collection_items(r.json(), element)
|
|
assert len(items) >= 1, f"{name}: expected seeded rows, got empty"
|
|
|
|
|
|
def test_host_activate_deactivate(session_ctx) -> None:
|
|
base, headers = session_ctx
|
|
hosts = requests.get(f"{base}/ovirt-engine/api/hosts", headers=headers, verify=False, timeout=60)
|
|
host = hosts.json()["host"]
|
|
hid = host[0]["id"] if isinstance(host, list) else host["id"]
|
|
for action in ("deactivate", "activate"):
|
|
r = requests.post(
|
|
f"{base}/ovirt-engine/api/hosts/{hid}/{action}",
|
|
headers=headers,
|
|
json={"action": {}},
|
|
verify=False,
|
|
timeout=60,
|
|
)
|
|
assert r.status_code == 200, action
|
|
|
|
|
|
def test_tags_bookmarks_crud(session_ctx) -> None:
|
|
base, headers = session_ctx
|
|
name = f"tag-{uuid.uuid4().hex[:8]}"
|
|
create = requests.post(
|
|
f"{base}/ovirt-engine/api/tags",
|
|
headers=headers,
|
|
json={"tag": {"name": name, "description": "t"}},
|
|
verify=False,
|
|
timeout=60,
|
|
)
|
|
assert create.status_code == 201, create.text
|
|
tid = create.json()["tag"]["id"]
|
|
got = requests.get(f"{base}/ovirt-engine/api/tags/{tid}", headers=headers, verify=False, timeout=60)
|
|
assert got.status_code == 200
|
|
delete = requests.delete(
|
|
f"{base}/ovirt-engine/api/tags/{tid}", headers=headers, verify=False, timeout=60
|
|
)
|
|
assert delete.status_code == 200
|
|
|
|
bname = f"bm-{uuid.uuid4().hex[:6]}"
|
|
bc = requests.post(
|
|
f"{base}/ovirt-engine/api/bookmarks",
|
|
headers=headers,
|
|
json={"bookmark": {"name": bname, "value": "Vms:"}},
|
|
verify=False,
|
|
timeout=60,
|
|
)
|
|
assert bc.status_code == 201
|
|
bid = bc.json()["bookmark"]["id"]
|
|
requests.delete(f"{base}/ovirt-engine/api/bookmarks/{bid}", headers=headers, verify=False, timeout=60)
|
|
|
|
|
|
def test_snapshot_flow(session_ctx) -> None:
|
|
base, headers = session_ctx
|
|
clusters = requests.get(f"{base}/ovirt-engine/api/clusters", headers=headers, verify=False, timeout=60)
|
|
cluster = clusters.json()["cluster"]
|
|
cid = cluster[0]["id"] if isinstance(cluster, list) else cluster["id"]
|
|
vm = requests.post(
|
|
f"{base}/ovirt-engine/api/vms",
|
|
headers=headers,
|
|
json={"vm": {"name": f"snap-{uuid.uuid4().hex[:6]}", "cluster": {"id": cid}}},
|
|
verify=False,
|
|
timeout=60,
|
|
).json()["vm"]
|
|
snap = requests.post(
|
|
f"{base}/ovirt-engine/api/vms/{vm['id']}/snapshots",
|
|
headers=headers,
|
|
json={"snapshot": {"description": "s1"}},
|
|
verify=False,
|
|
timeout=60,
|
|
)
|
|
assert snap.status_code == 201
|
|
sid = snap.json()["snapshot"]["id"]
|
|
lst = requests.get(
|
|
f"{base}/ovirt-engine/api/vms/{vm['id']}/snapshots",
|
|
headers=headers,
|
|
verify=False,
|
|
timeout=60,
|
|
)
|
|
assert lst.status_code == 200
|
|
requests.delete(
|
|
f"{base}/ovirt-engine/api/vms/{vm['id']}/snapshots/{sid}",
|
|
headers=headers,
|
|
verify=False,
|
|
timeout=60,
|
|
)
|
|
requests.delete(f"{base}/ovirt-engine/api/vms/{vm['id']}", headers=headers, verify=False, timeout=60)
|