Add self-contained API simulators lab with Compose and Helm.
Ship Proxmox, oVirt, VMware, and OpenStack behind one Postgres stack, Makefile helpers (up/clean/helm up|down/push), and a Helm chart with namespace, Let's Encrypt ingresses, migrate inits, and skip-if-seeded jobs.
This commit is contained in:
@@ -0,0 +1,258 @@
|
||||
# Laboratory defaults — rotate secrets before any non-lab use.
|
||||
|
||||
nameOverride: ""
|
||||
fullnameOverride: "simulators"
|
||||
|
||||
# Target Kubernetes namespace (also used by make helm up/down).
|
||||
namespace: simulators
|
||||
# Create the Namespace resource from this chart.
|
||||
namespaceCreate: true
|
||||
|
||||
imagePullSecrets: []
|
||||
ticketSigningKey: development-only-signing-key-change-me
|
||||
logLevel: INFO
|
||||
imageTag: latest
|
||||
|
||||
postgres:
|
||||
enabled: true
|
||||
image:
|
||||
repository: postgres
|
||||
tag: 17.5-bookworm
|
||||
pullPolicy: IfNotPresent
|
||||
auth:
|
||||
username: lab
|
||||
password: lab
|
||||
database: postgres
|
||||
persistence:
|
||||
enabled: true
|
||||
size: 5Gi
|
||||
storageClass: ""
|
||||
resources: {}
|
||||
# users/databases created on first start (empty volume only)
|
||||
initDatabases:
|
||||
- user: proxmox
|
||||
password: proxmox
|
||||
database: proxmox_simulator
|
||||
- user: ovirt
|
||||
password: ovirt
|
||||
database: ovirt_simulator
|
||||
- user: vmware
|
||||
password: vmware
|
||||
database: vmware_simulator
|
||||
- user: openstack
|
||||
password: openstack
|
||||
database: openstack_simulator
|
||||
|
||||
simulators:
|
||||
proxmox:
|
||||
enabled: true
|
||||
image:
|
||||
repository: inecs/proxmox-api-simulator
|
||||
pullPolicy: IfNotPresent
|
||||
port: 8006
|
||||
healthPath: /health/ready
|
||||
replicas: 1
|
||||
db:
|
||||
user: proxmox
|
||||
password: proxmox
|
||||
name: proxmox_simulator
|
||||
env:
|
||||
CONTRACT_SNAPSHOT: /app/contracts/pve-9.2.3.json
|
||||
COMPATIBILITY_EVIDENCE: /app/evidence/pve-9.2.3.json
|
||||
TASK_WORKER_CONCURRENCY: "2"
|
||||
SIMULATION_TIME_SCALE: "10"
|
||||
migrate:
|
||||
enabled: true
|
||||
command: ["python", "-m", "app.db.migrate_cli"]
|
||||
seed:
|
||||
enabled: true
|
||||
# Skip seed Job when this query returns a row (already seeded).
|
||||
skipIfSql: "SELECT 1 FROM nodes LIMIT 1"
|
||||
command: ["python", "-m", "app.simulation.seed_cli"]
|
||||
env:
|
||||
SEED_PROFILE: small
|
||||
resources: {}
|
||||
|
||||
ovirt:
|
||||
enabled: true
|
||||
image:
|
||||
repository: inecs/ovirt-api-simulator
|
||||
pullPolicy: IfNotPresent
|
||||
port: 8080
|
||||
healthPath: /health/ready
|
||||
replicas: 1
|
||||
db:
|
||||
user: ovirt
|
||||
password: ovirt
|
||||
name: ovirt_simulator
|
||||
env:
|
||||
OVIRT_SERIES: "4.5"
|
||||
APP_PORT: "8080"
|
||||
migrate:
|
||||
enabled: true
|
||||
command: ["python", "-m", "app.db.migrate_cli"]
|
||||
seed:
|
||||
enabled: true
|
||||
skipIfSql: "SELECT 1 FROM ov_datacenters LIMIT 1"
|
||||
command: ["python", "-m", "app.ovirt.seed_cli", "--profile", "minimal"]
|
||||
resources: {}
|
||||
|
||||
vmware:
|
||||
enabled: true
|
||||
image:
|
||||
repository: inecs/vmware-api-simulator
|
||||
pullPolicy: IfNotPresent
|
||||
port: 8080
|
||||
healthPath: /health/ready
|
||||
replicas: 1
|
||||
db:
|
||||
user: vmware
|
||||
password: vmware
|
||||
name: vmware_simulator
|
||||
env:
|
||||
ENABLE_PVE_STUB: "false"
|
||||
SEED_VSPHERE_PROFILE: small
|
||||
APP_PORT: "8080"
|
||||
TASK_WORKER_CONCURRENCY: "2"
|
||||
SIMULATION_TIME_SCALE: "10"
|
||||
migrate:
|
||||
enabled: true
|
||||
command: ["python", "-m", "app.db.migrate_cli"]
|
||||
seed:
|
||||
enabled: true
|
||||
skipIfSql: "SELECT 1 FROM vsphere_objects LIMIT 1"
|
||||
command: ["python", "-m", "app.simulation.seed_cli"]
|
||||
env:
|
||||
SEED_PROFILE: small
|
||||
SEED_VSPHERE_PROFILE: small
|
||||
resources: {}
|
||||
|
||||
openstack:
|
||||
enabled: true
|
||||
image:
|
||||
repository: inecs/openstack-api-simulator
|
||||
pullPolicy: IfNotPresent
|
||||
port: 8080
|
||||
healthPath: /health/ready
|
||||
replicas: 1
|
||||
db:
|
||||
user: openstack
|
||||
password: openstack
|
||||
name: openstack_simulator
|
||||
env:
|
||||
APP_PORT: "8080"
|
||||
TASK_WORKER_CONCURRENCY: "2"
|
||||
SIMULATION_TIME_SCALE: "10"
|
||||
migrate:
|
||||
enabled: true
|
||||
command: ["python", "-m", "app.db.migrate_cli"]
|
||||
seed:
|
||||
enabled: true
|
||||
skipIfSql: "SELECT 1 FROM os_projects LIMIT 1"
|
||||
command: ["python", "-m", "app.openstack.seed_cli", "--profile", "minimal"]
|
||||
resources: {}
|
||||
|
||||
# Ingress hosts — edit here. Each enabled entry creates one Ingress.
|
||||
# Default hosts: <name>.lab.local — for Let's Encrypt use a public DNS name.
|
||||
ingressClassName: nginx
|
||||
|
||||
ingresses:
|
||||
proxmox:
|
||||
enabled: true
|
||||
className: "" # falls back to ingressClassName
|
||||
host: proxmox.lab.local
|
||||
path: /
|
||||
pathType: Prefix
|
||||
service: proxmox
|
||||
port: 8006
|
||||
tls:
|
||||
- secretName: simulators-proxmox-tls
|
||||
hosts: [proxmox.lab.local]
|
||||
annotations: {}
|
||||
|
||||
ovirt:
|
||||
enabled: true
|
||||
className: ""
|
||||
host: ovirt.lab.local
|
||||
path: /
|
||||
pathType: Prefix
|
||||
service: ovirt
|
||||
port: 8080
|
||||
tls:
|
||||
- secretName: simulators-ovirt-tls
|
||||
hosts: [ovirt.lab.local]
|
||||
annotations: {}
|
||||
|
||||
vmware:
|
||||
enabled: true
|
||||
className: ""
|
||||
host: vmware.lab.local
|
||||
path: /
|
||||
pathType: Prefix
|
||||
service: vmware
|
||||
port: 8080
|
||||
tls:
|
||||
- secretName: simulators-vmware-tls
|
||||
hosts: [vmware.lab.local]
|
||||
annotations:
|
||||
nginx.ingress.kubernetes.io/configuration-snippet: |
|
||||
proxy_set_header X-VMware-Service "vcenter";
|
||||
proxy_set_header X-Forwarded-Port "443";
|
||||
|
||||
openstack:
|
||||
enabled: true
|
||||
className: ""
|
||||
host: openstack.lab.local
|
||||
path: /
|
||||
pathType: Prefix
|
||||
service: openstack
|
||||
port: 8080
|
||||
tls:
|
||||
- secretName: simulators-openstack-tls
|
||||
hosts: [openstack.lab.local]
|
||||
annotations:
|
||||
nginx.ingress.kubernetes.io/configuration-snippet: |
|
||||
proxy_set_header X-OpenStack-Service "https";
|
||||
proxy_set_header X-Forwarded-Port "443";
|
||||
|
||||
# Optional extras — same shape as above, e.g.:
|
||||
# ovirt-ui:
|
||||
# enabled: true
|
||||
# host: ovirt-ui.lab.local
|
||||
# service: ovirt
|
||||
# port: 8080
|
||||
# tls:
|
||||
# - secretName: simulators-ovirt-ui-tls
|
||||
# hosts: [ovirt-ui.lab.local]
|
||||
# openstack-keystone:
|
||||
# enabled: true
|
||||
# host: keystone.lab.local
|
||||
# service: openstack
|
||||
# port: 8080
|
||||
# tls:
|
||||
# - secretName: simulators-keystone-tls
|
||||
# hosts: [keystone.lab.local]
|
||||
# annotations:
|
||||
# nginx.ingress.kubernetes.io/configuration-snippet: |
|
||||
# proxy_set_header X-OpenStack-Service "keystone";
|
||||
|
||||
# TLS via cert-manager + Let's Encrypt (HTTP-01).
|
||||
# Requires cert-manager in the cluster. Hosts must resolve publicly for ACME.
|
||||
certManager:
|
||||
enabled: true
|
||||
# Create ClusterIssuer resources from this chart (false = use existing letsencrypt-prod).
|
||||
createClusterIssuer: false
|
||||
createStagingIssuer: true
|
||||
email: "" # required when createClusterIssuer=true
|
||||
issuerName: letsencrypt-prod
|
||||
server: https://acme-v02.api.letsencrypt.org/directory
|
||||
stagingIssuerName: letsencrypt-staging
|
||||
stagingServer: https://acme-staging-v02.api.letsencrypt.org/directory
|
||||
useStaging: false
|
||||
solverIngressClassName: nginx
|
||||
|
||||
seedJobs:
|
||||
# post-install / post-upgrade Jobs; skipIfSql avoids re-seeding when data exists
|
||||
enabled: true
|
||||
backoffLimit: 3
|
||||
ttlSecondsAfterFinished: 600
|
||||
Reference in New Issue
Block a user