Add OpenStack request-body schemas and nested console PARAM sync.
This commit is contained in:
@@ -0,0 +1,33 @@
|
||||
"""Cluster size specs for demo seed profiles."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import pytest
|
||||
|
||||
from app.ovirt.demo_datacenter import CLUSTER_SIZES, normalize_cluster_size
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
("name", "hosts", "vms"),
|
||||
[
|
||||
("small", 3, 50),
|
||||
("large", 10, 1000),
|
||||
("big", 30, 2000),
|
||||
],
|
||||
)
|
||||
def test_cluster_size_targets(name: str, hosts: int, vms: int) -> None:
|
||||
spec = CLUSTER_SIZES[name]
|
||||
assert spec.hosts == hosts
|
||||
assert spec.vms == vms
|
||||
topology = spec.datacenters * spec.clusters_per_dc * spec.hosts_per_cluster
|
||||
assert topology == hosts
|
||||
|
||||
|
||||
def test_demo_alias_maps_to_large() -> None:
|
||||
assert normalize_cluster_size("demo") == "large"
|
||||
assert normalize_cluster_size("LARGE") == "large"
|
||||
|
||||
|
||||
def test_unknown_size_raises() -> None:
|
||||
with pytest.raises(ValueError):
|
||||
normalize_cluster_size("huge")
|
||||
@@ -0,0 +1,104 @@
|
||||
"""Console body examples use minimal-seed IDs and Engine-shaped roots."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from app.ovirt.ids import stable_id
|
||||
from app.web.ovirt_body_examples import body_example_for
|
||||
from app.web.ovirt_catalog import path_param_example
|
||||
|
||||
|
||||
def test_path_params_use_minimal_seed_ids() -> None:
|
||||
assert path_param_example("vmId") == str(stable_id("vm", "lab-vm-01"))
|
||||
assert path_param_example("hostId") == str(stable_id("host", "host01"))
|
||||
assert path_param_example("clusterId") == str(stable_id("cluster", "Default"))
|
||||
assert path_param_example("storageDomainId") == str(stable_id("sd", "data1"))
|
||||
|
||||
|
||||
def test_post_vm_body_is_root_wrapped_with_cluster_ref() -> None:
|
||||
body = body_example_for(method="POST", kind="collection", element="vm", path="/vms")
|
||||
assert body is not None
|
||||
assert "vm" in body
|
||||
vm = body["vm"]
|
||||
assert vm["cluster"]["id"] == str(stable_id("cluster", "Default"))
|
||||
assert vm["template"]["name"] == "Blank"
|
||||
|
||||
|
||||
def test_disk_attachment_creates_disk_inline() -> None:
|
||||
body = body_example_for(
|
||||
method="POST",
|
||||
kind="collection",
|
||||
element="disk_attachment",
|
||||
path="/vms/{vm_id}/diskattachments",
|
||||
)
|
||||
assert body is not None
|
||||
disk = body["disk_attachment"]["disk"]
|
||||
assert "id" not in disk
|
||||
assert disk["name"] == "example-attached-disk"
|
||||
assert disk["provisioned_size"] == 10737418240
|
||||
|
||||
|
||||
def test_put_does_not_rename_entity() -> None:
|
||||
body = body_example_for(method="PUT", kind="item", element="vm", path="/vms/{vm_id}")
|
||||
assert body is not None
|
||||
assert "name" not in body["vm"]
|
||||
assert body["vm"]["description"].startswith("Updated")
|
||||
|
||||
|
||||
def test_action_start_uses_action_root() -> None:
|
||||
body = body_example_for(
|
||||
method="POST", kind="action", element="action", path="/vms/{vm_id}/start"
|
||||
)
|
||||
assert body == {"action": {"async": True}}
|
||||
|
||||
|
||||
def test_body_fields_derived_from_example_for_params_drawer() -> None:
|
||||
from app.web.ovirt_catalog import _body_fields_from_example, ovirt_method_payload
|
||||
|
||||
fields = _body_fields_from_example(
|
||||
{"bookmark": {"name": "example-bookmark", "value": "Vms: status=up"}},
|
||||
element="bookmark",
|
||||
)
|
||||
names = {f["name"] for f in fields}
|
||||
assert names == {"name", "value"}
|
||||
|
||||
payload = ovirt_method_payload(
|
||||
major=45,
|
||||
path="/ovirt-engine/api/bookmarks",
|
||||
verb="POST",
|
||||
runtime_version="ovirt-4.5",
|
||||
)
|
||||
assert payload["body_example"] is not None
|
||||
assert "bookmark" in payload["body_example"]
|
||||
field_names = {f["name"] for f in payload["body_fields"]}
|
||||
assert "name" in field_names
|
||||
assert "value" in field_names
|
||||
|
||||
|
||||
def test_body_fields_include_nested_vm_example_paths() -> None:
|
||||
from app.web.ovirt_catalog import _body_fields_from_example, ovirt_method_payload
|
||||
from app.web.ovirt_body_examples import body_example_for
|
||||
|
||||
example = body_example_for(
|
||||
method="POST",
|
||||
kind="collection",
|
||||
element="vm",
|
||||
path="/ovirt-engine/api/vms",
|
||||
)
|
||||
fields = _body_fields_from_example(example, element="vm")
|
||||
names = {f["name"] for f in fields}
|
||||
assert "name" in names
|
||||
assert "memory" in names
|
||||
assert "cpu.topology.sockets" in names
|
||||
assert "os.type" in names
|
||||
assert "cluster.id" in names
|
||||
assert "template.name" in names
|
||||
|
||||
payload = ovirt_method_payload(
|
||||
major=45,
|
||||
path="/ovirt-engine/api/vms",
|
||||
verb="POST",
|
||||
runtime_version="ovirt-4.5",
|
||||
)
|
||||
nested = {f["name"] for f in payload["body_fields"]}
|
||||
assert "cluster.id" in nested
|
||||
assert "cpu.topology.cores" in nested
|
||||
Reference in New Issue
Block a user