Initial commit: VMware vSphere API simulator scaffold.
Add the FastAPI app, PostgreSQL migrations, Docker/Helm packaging, API contracts, docs, client examples, and the unit/integration/compatibility test suite for local client and tooling labs without a real vCenter.
This commit is contained in:
@@ -0,0 +1,6 @@
|
||||
name: pulumi-tests-folders
|
||||
runtime:
|
||||
name: python
|
||||
options:
|
||||
virtualenv: .venv
|
||||
description: Create VM folder via pulumi-vsphere
|
||||
@@ -0,0 +1,40 @@
|
||||
"""Create a VM folder with pulumi-vsphere Folder."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import os
|
||||
import uuid
|
||||
|
||||
import pulumi
|
||||
import pulumi_vsphere as vsphere
|
||||
|
||||
user = os.environ.get("VSPHERE_USER", "administrator@vsphere.local")
|
||||
password = os.environ.get("VSPHERE_PASSWORD", "VMware1!")
|
||||
server = os.environ.get("VSPHERE_SERVER", "api-gateway")
|
||||
datacenter_name = os.environ.get("VSPHERE_DATACENTER", "Datacenter")
|
||||
run_id = os.environ.get("TEST_RUN_ID") or uuid.uuid4().hex[:8]
|
||||
folder_name = os.environ.get("VSPHERE_LAB_FOLDER", f"pulumi-folder-{run_id}")
|
||||
|
||||
provider = vsphere.Provider(
|
||||
"vsphere",
|
||||
user=user,
|
||||
password=password,
|
||||
vsphere_server=server,
|
||||
allow_unverified_ssl=True,
|
||||
)
|
||||
invoke_opts = pulumi.InvokeOptions(provider=provider)
|
||||
res_opts = pulumi.ResourceOptions(provider=provider)
|
||||
|
||||
dc = vsphere.get_datacenter_output(name=datacenter_name, opts=invoke_opts)
|
||||
|
||||
folder = vsphere.Folder(
|
||||
"lab-folder",
|
||||
path=folder_name,
|
||||
type="vm",
|
||||
datacenter_id=dc.id,
|
||||
opts=res_opts,
|
||||
)
|
||||
|
||||
pulumi.export("folder_id", folder.id)
|
||||
pulumi.export("folder_path", folder.path)
|
||||
pulumi.export("datacenter_id", dc.id)
|
||||
@@ -0,0 +1,2 @@
|
||||
pulumi>=3.0.0,<4
|
||||
pulumi-vsphere==4.17.0
|
||||
@@ -0,0 +1,3 @@
|
||||
name: vsphere-inventory
|
||||
runtime: python
|
||||
description: pulumi-vsphere inventory data sources against the lab simulator
|
||||
@@ -0,0 +1,81 @@
|
||||
"""Inventory lookups via official pulumi-vsphere (SOAP/VIM)."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import os
|
||||
|
||||
import pulumi
|
||||
import pulumi_vsphere as vsphere
|
||||
|
||||
user = os.environ.get("VSPHERE_USER", "administrator@vsphere.local")
|
||||
password = os.environ.get("VSPHERE_PASSWORD", "VMware1!")
|
||||
server = os.environ.get("VSPHERE_SERVER", "api-gateway")
|
||||
datacenter_name = os.environ.get("VSPHERE_DATACENTER", "Datacenter")
|
||||
datastore_name = os.environ.get("VSPHERE_DATASTORE", "datastore1")
|
||||
cluster_name = os.environ.get("VSPHERE_CLUSTER", "Cluster")
|
||||
network_name = os.environ.get("VSPHERE_NETWORK", "VM Network")
|
||||
vm_name = os.environ.get("VSPHERE_VM_NAME", "web-01")
|
||||
host_name = os.environ.get("VSPHERE_HOST", "esxi01.lab.local")
|
||||
folder_path = os.environ.get("VSPHERE_FOLDER_PATH", f"/{datacenter_name}/vm/production")
|
||||
pool_name = os.environ.get("VSPHERE_RESOURCE_POOL", "Resources")
|
||||
|
||||
provider = vsphere.Provider(
|
||||
"vsphere",
|
||||
user=user,
|
||||
password=password,
|
||||
vsphere_server=server,
|
||||
allow_unverified_ssl=True,
|
||||
)
|
||||
|
||||
invoke_opts = pulumi.InvokeOptions(provider=provider)
|
||||
|
||||
dc = vsphere.get_datacenter_output(name=datacenter_name, opts=invoke_opts)
|
||||
ds = vsphere.get_datastore_output(
|
||||
name=datastore_name,
|
||||
datacenter_id=dc.id,
|
||||
opts=invoke_opts,
|
||||
)
|
||||
cluster = vsphere.get_compute_cluster_output(
|
||||
name=cluster_name,
|
||||
datacenter_id=dc.id,
|
||||
opts=invoke_opts,
|
||||
)
|
||||
network = vsphere.get_network_output(
|
||||
name=network_name,
|
||||
datacenter_id=dc.id,
|
||||
opts=invoke_opts,
|
||||
)
|
||||
vm = vsphere.get_virtual_machine_output(
|
||||
name=vm_name,
|
||||
datacenter_id=dc.id,
|
||||
opts=invoke_opts,
|
||||
)
|
||||
host = vsphere.get_host_output(
|
||||
name=host_name,
|
||||
datacenter_id=dc.id,
|
||||
opts=invoke_opts,
|
||||
)
|
||||
folder = vsphere.get_folder_output(path=folder_path, opts=invoke_opts)
|
||||
pool = vsphere.get_resource_pool_output(
|
||||
name=pool_name,
|
||||
datacenter_id=dc.id,
|
||||
opts=invoke_opts,
|
||||
)
|
||||
|
||||
pulumi.export("datacenter_id", dc.id)
|
||||
pulumi.export("datacenter_name", dc.name)
|
||||
pulumi.export("datastore_id", ds.id)
|
||||
pulumi.export("datastore_name", ds.name)
|
||||
pulumi.export("cluster_id", cluster.id)
|
||||
pulumi.export("cluster_name", cluster.name)
|
||||
pulumi.export("resource_pool_id", pool.id)
|
||||
pulumi.export("resource_pool_name", pool.name)
|
||||
pulumi.export("cluster_resource_pool_id", cluster.resource_pool_id)
|
||||
pulumi.export("network_id", network.id)
|
||||
pulumi.export("network_name", network.name)
|
||||
pulumi.export("vm_id", vm.id)
|
||||
pulumi.export("vm_name", vm.name)
|
||||
pulumi.export("host_id", host.id)
|
||||
pulumi.export("host_name", host.name)
|
||||
pulumi.export("folder_id", folder.id)
|
||||
pulumi.export("folder_path", folder.path)
|
||||
@@ -0,0 +1,2 @@
|
||||
pulumi>=3.120,<4
|
||||
pulumi-vsphere==4.17.0
|
||||
@@ -0,0 +1,3 @@
|
||||
name: vsphere-tags
|
||||
runtime: python
|
||||
description: pulumi-vsphere TagCategory + Tag against the lab simulator
|
||||
@@ -0,0 +1,45 @@
|
||||
"""Tag category + tag via pulumi-vsphere."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import os
|
||||
import uuid
|
||||
|
||||
import pulumi
|
||||
import pulumi_vsphere as vsphere
|
||||
|
||||
user = os.environ.get("VSPHERE_USER", "administrator@vsphere.local")
|
||||
password = os.environ.get("VSPHERE_PASSWORD", "VMware1!")
|
||||
server = os.environ.get("VSPHERE_SERVER", "api-gateway")
|
||||
run_id = os.environ.get("TEST_RUN_ID") or uuid.uuid4().hex[:8]
|
||||
|
||||
provider = vsphere.Provider(
|
||||
"vsphere",
|
||||
user=user,
|
||||
password=password,
|
||||
vsphere_server=server,
|
||||
allow_unverified_ssl=True,
|
||||
)
|
||||
opts = pulumi.ResourceOptions(provider=provider)
|
||||
|
||||
category = vsphere.TagCategory(
|
||||
"lab-category",
|
||||
name=f"pulumi-cat-{run_id}",
|
||||
description="pulumi-tests",
|
||||
cardinality="MULTIPLE",
|
||||
associable_types=["VirtualMachine"],
|
||||
opts=opts,
|
||||
)
|
||||
|
||||
tag = vsphere.Tag(
|
||||
"lab-tag",
|
||||
name=f"pulumi-tag-{run_id}",
|
||||
description="pulumi-tests",
|
||||
category_id=category.id,
|
||||
opts=opts,
|
||||
)
|
||||
|
||||
pulumi.export("category_id", category.id)
|
||||
pulumi.export("category_name", category.name)
|
||||
pulumi.export("tag_id", tag.id)
|
||||
pulumi.export("tag_name", tag.name)
|
||||
@@ -0,0 +1,2 @@
|
||||
pulumi>=3.120,<4
|
||||
pulumi-vsphere==4.17.0
|
||||
@@ -0,0 +1 @@
|
||||
encryptionsalt: v1:UUjhYFprJyY=:v1:an60sL6CLXStUIcl:mJhUQXmFtkRGQyBEokvqKfyRrAfKrA==
|
||||
@@ -0,0 +1 @@
|
||||
encryptionsalt: v1:LVYgzGHt9FE=:v1:eSMxx80CDF7fdjC7:vjS6R4g5y17oCo7Zla2RVreTGVt5Ew==
|
||||
@@ -0,0 +1 @@
|
||||
encryptionsalt: v1:IF5v/IbhjaY=:v1:LMDcKVXc3t3kK9c8:i7oLeO3Z68leNZMNWy8p4ABQXtU/MA==
|
||||
@@ -0,0 +1 @@
|
||||
encryptionsalt: v1:o52eDGvINSY=:v1:FNi0o3DBgs7EGXOK:DvcytDQKTUTZJlzP5FHpmO4Tz5x0lA==
|
||||
@@ -0,0 +1 @@
|
||||
encryptionsalt: v1:T3Ad5ENWpbA=:v1:HPpPGCMDQLdXR4Rd:IoE+7gigbnLsdamOgHQQ/Mjz7OZoKA==
|
||||
@@ -0,0 +1 @@
|
||||
encryptionsalt: v1:OJmTQsPHPwc=:v1:t9AexCKmbXhXOznA:IcfsNrOKNTSCgrh71oUi1PE2aXQ0lg==
|
||||
@@ -0,0 +1 @@
|
||||
encryptionsalt: v1:qwT7qp8s1FE=:v1:6yP9NvJX8W1ii/42:Ttz0zuFgzXGjXp6A8njVA+Nju19g7g==
|
||||
@@ -0,0 +1 @@
|
||||
encryptionsalt: v1:hy1rhuyush0=:v1:CIJbh/gDFQ0YxPP0:0+Vt7PEFzLcIS+OgxI1eH6qyTu4HMA==
|
||||
@@ -0,0 +1 @@
|
||||
encryptionsalt: v1:S591FZsC2xY=:v1:EL5tsMvtoQLo3dKy:B/SdC/zmTRMiVqVq/iq/qYKjREEtwg==
|
||||
@@ -0,0 +1 @@
|
||||
encryptionsalt: v1:hW4ggRSXmtY=:v1:AHzkGYnVoCq5dm7x:ixBIw+836wzBfjUgo2sZevU2x2FFcw==
|
||||
@@ -0,0 +1,3 @@
|
||||
name: vsphere-vm-lifecycle
|
||||
runtime: python
|
||||
description: pulumi-vsphere VirtualMachine create/destroy against the lab simulator
|
||||
@@ -0,0 +1,71 @@
|
||||
"""Create a lab VM with pulumi-vsphere VirtualMachine."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import os
|
||||
import uuid
|
||||
|
||||
import pulumi
|
||||
import pulumi_vsphere as vsphere
|
||||
|
||||
user = os.environ.get("VSPHERE_USER", "administrator@vsphere.local")
|
||||
password = os.environ.get("VSPHERE_PASSWORD", "VMware1!")
|
||||
server = os.environ.get("VSPHERE_SERVER", "api-gateway")
|
||||
datacenter_name = os.environ.get("VSPHERE_DATACENTER", "Datacenter")
|
||||
datastore_name = os.environ.get("VSPHERE_DATASTORE", "datastore1")
|
||||
cluster_name = os.environ.get("VSPHERE_CLUSTER", "Cluster")
|
||||
network_name = os.environ.get("VSPHERE_NETWORK", "VM Network")
|
||||
run_id = os.environ.get("TEST_RUN_ID") or uuid.uuid4().hex[:8]
|
||||
vm_name = os.environ.get("VSPHERE_LAB_VM_NAME", f"pulumi-lab-{run_id}")
|
||||
|
||||
provider = vsphere.Provider(
|
||||
"vsphere",
|
||||
user=user,
|
||||
password=password,
|
||||
vsphere_server=server,
|
||||
allow_unverified_ssl=True,
|
||||
)
|
||||
invoke_opts = pulumi.InvokeOptions(provider=provider)
|
||||
res_opts = pulumi.ResourceOptions(provider=provider)
|
||||
|
||||
dc = vsphere.get_datacenter_output(name=datacenter_name, opts=invoke_opts)
|
||||
ds = vsphere.get_datastore_output(
|
||||
name=datastore_name,
|
||||
datacenter_id=dc.id,
|
||||
opts=invoke_opts,
|
||||
)
|
||||
cluster = vsphere.get_compute_cluster_output(
|
||||
name=cluster_name,
|
||||
datacenter_id=dc.id,
|
||||
opts=invoke_opts,
|
||||
)
|
||||
network = vsphere.get_network_output(
|
||||
name=network_name,
|
||||
datacenter_id=dc.id,
|
||||
opts=invoke_opts,
|
||||
)
|
||||
|
||||
vm = vsphere.VirtualMachine(
|
||||
"lab-vm",
|
||||
name=vm_name,
|
||||
resource_pool_id=cluster.resource_pool_id,
|
||||
datastore_id=ds.id,
|
||||
num_cpus=1,
|
||||
memory=1024,
|
||||
guest_id="otherGuest64",
|
||||
wait_for_guest_net_timeout=0,
|
||||
wait_for_guest_ip_timeout=0,
|
||||
network_interfaces=[
|
||||
vsphere.VirtualMachineNetworkInterfaceArgs(network_id=network.id),
|
||||
],
|
||||
disks=[
|
||||
vsphere.VirtualMachineDiskArgs(label="disk0", size=16),
|
||||
],
|
||||
opts=res_opts,
|
||||
)
|
||||
|
||||
pulumi.export("lab_vm_id", vm.id)
|
||||
pulumi.export("lab_vm_name", vm.name)
|
||||
pulumi.export("resource_pool_id", cluster.resource_pool_id)
|
||||
pulumi.export("datastore_id", ds.id)
|
||||
pulumi.export("network_id", network.id)
|
||||
@@ -0,0 +1,2 @@
|
||||
pulumi>=3.120,<4
|
||||
pulumi-vsphere==4.17.0
|
||||
Reference in New Issue
Block a user