Skip to content

feat(vsphere): add vCenter OpenAPI spec and Studio Project - #52

Merged
michaelelrom merged 12 commits into
itential:mainfrom
michaelelrom:feat/vsphere-openapi-spec
Aug 7, 2026
Merged

feat(vsphere): add vCenter OpenAPI spec and Studio Project#52
michaelelrom merged 12 commits into
itential:mainfrom
michaelelrom:feat/vsphere-openapi-spec

Conversation

@michaelelrom

Copy link
Copy Markdown
Collaborator

Summary

  • Adds VMware/vSphere/OpenAPIs/: a full 178-operation vCenter REST API spec (vmware_vsphere_vcenter-2.0.0.json) generated from a live vCenter instance via VMware's vmware-openapi-generator (no vendor-published OpenAPI spec exists), plus a curated 91-operation -latest.json covering common CRUD for infrastructure automation.
  • Adds VMware/vSphere/Studio Projects/VMware vSphere vCenter.project.json: a 22-workflow Studio Project (Inventory — read-only inventory lookups; Virtual Machines — full lifecycle: create, read, hardware update, power, delete), scoped to CRUD only where the vCenter REST API actually supports it. Every workflow tested against a live vCenter instance.
  • Adds product README.md covering integration configuration (including vCenter's dynamic session-token auth via x-itential-dynamic-retrieval), the OpenAPI spec breakdown, the Studio Project's folder structure, and known limitations (no server-side list filtering, no cluster/host/resource-pool capacity data).
  • Adds a root README.md vendor index entry for VMware.
  • Minor STANDARDS.md correction: reworded the Studio Projects "Sample Use Case" requirement to optional guidance — only 2 of 22 existing Studio Project contributions actually follow it as written.

Notes for reviewers

  • vSphere's REST API uses dot-notation query parameter names for list filters (e.g. filter.names), which Itential Platform's naming convention doesn't allow. These optional filter parameters are omitted from every list operation in both spec files; all list operations still work and return the full unfiltered result set. Documented in the product README's Known Limitations section.
  • No Sample Use Case / orchestrated workflow is included by design — the two folders (Inventory, Virtual Machines) are meant to stand alone as atomic, reusable building blocks.

Test plan

  • Both OpenAPI specs imported successfully as Integration Models on a running Itential Platform instance
  • All 22 Studio Project workflows tested against a live vCenter instance; read-only workflows (List/Get) confirmed returning real data
  • Root README vendor index and product README reviewed for accuracy against the final asset state

mikeelrom and others added 12 commits August 7, 2026 09:55
Full, unmodified vCenter Automation API surface (137 operations) generated
via vmware-openapi-generator against a live vCenter 9.1 instance. Security
scheme, curated -latest spec, and README to follow.
- Fix OpenAPI 3.0 validation failure: the generator emitted a Swagger
  2.0-style top-level `items` on the `features` query parameter instead
  of nesting it under `schema` — confirmed via Itential Platform's own
  ajv-based OpenAPI validator (core/integrations/OpenAPIUtils.js).
- Add the `sessionIdAuth` apiKey securityScheme (vmware-api-session-id
  header) so the spec can drive Itential's dynamicRetrieval auth flow
  against vCenter's session-creation endpoint.
- Verified end-to-end: passes ensureOA3 validation and the actual
  swaggerToPronghorn conversion (178 methods) used at model import time.
…ndex entry

- vmware_vsphere_vcenter-latest.json: trimmed from 178 to 91 operations,
  dropping vCenter appliance self-administration (deployment/upgrade
  bootstrap, TLS/cert management, VCHA setup, SSO topology, internal
  services, CEIP/PSC config) and legacy peripheral hardware (floppy/
  parallel/serial). Verified against Itential's OpenAPI validator and
  swaggerToPronghorn conversion (91 methods, matching the trim).
- README.md documents the dynamicRetrieval session-auth setup and the
  curated spec's included/excluded resource categories.
- Adds VMware to the root README vendor index.
The generator was run without vmware-openapi-generator's -uo/
--unique-operation-ids flag, so most operationIds were left as bare
vAPI action names (get, list, create, find, ...) that collide across
almost every resource. Itential Platform's model-import validation
(core/integrations/Gateway.js) rejects any spec with a duplicate
operationId, which is what surfaced on import ("duplicate operation
id: find").

Fixed by re-deriving operationIds using the generator's own
create_camelized_op_id/create_unique_op_ids algorithm (path_processing.py)
applied directly to the already-generated files, rather than requiring
a full regeneration against live vCenter. Re-verified against the
platform's actual OpenAPI validator, the exact duplicate-operationId
check from Gateway.js, and the swaggerToPronghorn conversion — all
178 (full) / 91 (latest) operationIds are now unique end to end.
…Retrieval config

The sessionIdAuth scheme had the runtime dynamicRetrieval plumbing
(x-itential-parameters) but not the schema/integrationSchema.js
opt-in flag (x-itential-dynamic-retrieval: true) that tells Itential
Platform's config-template generator to actually offer the
dynamicRetrieval shape. Without it, getAuthSchema() falls back to a
plain static apiKey scaffold (a required "value" field), which is
what showed up in the Connection Properties UI instead of the
documented dynamicRetrieval flow.

Verified via schema/integrationSchema.js's getAuthSchema() directly:
sessionIdAuth's generated schema now includes dynamicRetrieval and
no longer requires a static "value".
Itential Platform's dynamicRetrieval default-value generation for
apiKey schemes has a confirmed bug (Gateway.js getThisAuth(), reported
to Itential's IPSO project) that assigns the x-itential-dynamic-retrieval
flag's boolean value instead of a placeholder object, which fails
schema validation and blocks creating any integration instance for a
model using that flag.

Until that's fixed, drop x-itential-dynamic-retrieval and its
x-itential-parameters from sessionIdAuth and require a static value
instead. Admins generate a vCenter session token via curl and paste it
into the integration's Connection Properties, re-generating it when it
expires (~30 min idle timeout by default). README updated to match.
… boolean flag

Root cause of the earlier "must be object" schema validation error was
not a platform bug: x-itential-dynamic-retrieval is meant to hold the
actual retrieval config object ({method, url, responsePointer}), not
a boolean opt-in flag. Gateway.js's getThisAuth() carries this
extension value through verbatim as the default authentication value
on integration creation -- setting it to `true` produced an invalid
boolean default, while setting it to the real object (with a
placeholder host) produces a valid, pre-filled default that passes
schema validation immediately.

Also moved the Authorization credential from a top-level `variables`
entry into the scheme's own `x-itential-parameters` (dropping
x-itential-variable so it surfaces under authentication.sessionIdAuth
.parameters.Authorization directly), matching a known-working sibling
spec.

Verified end-to-end: replicated Gateway.js's getThisAuth() logic
exactly and confirmed the generated default value validates against
schema/integrationSchema.js's getAuthSchema() output, in addition to
the existing OpenAPI 3.0, duplicate-operationId, and pronghorn
conversion checks.
…ask naming

Itential Platform's task-input naming convention
(@itential/itential-utils NamingConventions.validateVariableName)
disallows dots, but vSphere's REST API uses dot-notation query
parameter names for every list-operation filter (filter.names,
filter.clusters, etc.). Confirmed by tracing IntegrationUtils.js's
buildRequest/validateMethodParams that a parameter's OpenAPI `name`
field is used as both the task input name and the literal wire query
key, with no aliasing mechanism -- so renaming to a valid identifier
would silently break the actual API call instead of just fixing the
task-creation error.

All affected filters are optional; list operations still return the
full result set without them. Removed 53 params across 15 operations
(2.0.0.json) / 49 params across 12 operations (latest.json). Verified
zero remaining naming-convention violations via the platform's own
validateVariableName, plus the existing ajv/duplicate-operationId/
pronghorn-conversion checks.
Adds a 22-workflow Studio Project (Inventory + Virtual Machines) covering
the vCenter REST API operations most useful for infrastructure automation,
so users don't have to dig through the full API surface to find them.
CRUD is scoped to where the API actually supports it: inventory objects
are read-only, virtual machines get full lifecycle coverage.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The full-spec section referenced a "described above" note that was
removed during README cleanup, leaving a dangling reference.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…cts standard

Only 2 of 22 existing Studio Project contributions (Meraki, Panorama)
actually pair a Sample Use Case with an Automation + Trigger, so this
read as a hard requirement the rest of the repo doesn't follow. Reworded
to make it optional guidance instead.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…dard

Not worth documenting as guidance either -- most Studio Project
contributions don't include one, and there's no repo-wide expectation
that they should.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@michaelelrom
michaelelrom merged commit 9118ab0 into itential:main Aug 7, 2026
@michaelelrom
michaelelrom deleted the feat/vsphere-openapi-spec branch August 7, 2026 20:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants