Connect Entuity Network Analytics (Park Place Technologies ENA) to Versus over its RESTful API to see the monitored inventory, open incidents, events, Views and port state, reconcile and import the monitored estate into the Versus inventory, and close or annotate incidents from a governed workflow.
Versus connects to Entuity Network Analytics (ENA, from Park Place Technologies) — the network monitoring platform that already polls the switches, routers, firewalls, load balancers and hosts in many estates — so what Entuity knows becomes part of network automation. From the Integrations page, a workflow or the AutoPilot you can see which devices Entuity monitors and how, which incidents are open right now and on what, the event stream behind them, the Views the NOC works from and the port state of any monitored device, and you can reconcile Entuity's inventory with the Versus inventory and import what is missing.
The integration is read-first: every lookup is a plain API read. The write actions (close or annotate an incident, raise an event, import devices) are ordinary SDK calls you place behind an approval gate in a governed workflow.
An Entuity source in Versus points at one ENA web server. Everything goes through the Entuity RESTful API under /api on that server:
| Resource | Used for |
|---|---|
version, info, servers | What Versus is talking to (API contract, server name, remote servers in a multi-server deployment) |
inventory, inventory/{id} | The device inventory: name, polled name, management IP, device type, SNMP sysDescr / sysLocation / sysObjectID, management level, config-management state |
views, views/{id}/objects | Views and the objects in them (devices by default, any StormWorks type on request) |
objects/{swId}/attributes, …/ports, …/configManagement | Attributes (reachability, uptime, …), ports with admin / operational state, speed, IPs, VLANs and connected hosts, and the configuration-management settings of a device |
incidents, events, incidentTypes, eventTypes | Open and closed incidents and the events behind them, with severity, state, time-window and View filters |
POST events, PUT incidents/{id} | Raise an event; change an incident's state or annotation |
maintenance, zones | Maintenance windows and NAT zones |
Authentication is either an Entuity user over HTTP Basic (RFC 2617; Entuity caches the result for five minutes) or an access key sent in the ENA-Api-Key header (keys live in accessKeys.properties on the ENA server and map to an Entuity user). Either way the user's Entuity permissions scope what the API returns, so a read-only user is enough for everything except closing or annotating incidents and raising events. Use HTTPS — Basic credentials travel in clear text otherwise.
Secrets are write-only and encrypted at rest — they are never returned by the API, and editing a source lets you leave them blank to keep the stored values. See Security & Compliance.
| Field | Meaning |
|---|---|
| ENA server URL | https://ena.corp.com — the web server; Versus appends /api |
| API version | Blank tracks the latest resources at /api/…; set v2 to pin the frozen contract at /api/v2/… for long-lived integrations |
| Authentication | Entuity user + password, or an access key |
| Default View | Optional View (id, name or path) that scopes events, incidents and view objects by default — useful when one ENA serves several regions |
| Verify SSL | Off only when the ENA server presents a certificate you have not imported |
Test reads the API version, counts servers, inventory devices and open incidents, and records them on the source.
Open Integrations → Entuity → Explore on a source. Every tab shows whether the data is Live from ENA or, for a seeded demo source, Sample data.
Severity follows Entuity's scale — info (2), minor (4), major (6), severe (8), critical (10).
The Python SDK exposes Entuity as versus.integrations.entuity() — the first enabled source, or versus.integrations.entuity('ENA Toronto') by name.
ena = versus.integrations.entuity()
# what is Entuity complaining about on this device?
for inc in ena.incidents_for('10.10.1.1'): # name, polled name or management IP
versus.log(f"[{inc['severity_label']}] {inc['description']} — {inc['details']}")
# Entuity's record for the device, and its ports that are admin-up but operationally down
dev = ena.find_device('tor-core-sw-01')
down = [p for p in ena.ports(dev['sw_id']) if p['admin_status'] == 'up' and p['oper_status'] == 'down']
# the estate
devices = ena.inventory(q='tor-')
views = ena.views()
perimeter = ena.view_objects('Perimeter')
critical = ena.incidents(states='open', min_severity='severe')
recent = ena.events(hours=6, min_severity='major')
# inventory drift between the two systems
gap = ena.reconcile() # {matched, only_entuity, only_versus, counts}
Actions — place these after a core.approval step in a governed workflow:
ena.close_incident(63, annotation='Port Gi1/0/24 replaced SFP — workflow run 1234')
ena.annotate_incident(61, 'ISP B case 00412 open')
ena.raise_event('Versus change window started', severity='info', source='Versus', reason='CHGT0042')
ena.import_devices(all_missing=True) # or ids=['107', '116']
incidents_for() is the building block for a closed loop with the Diagnostics AutoPilot and the Desk: an Entuity incident names a device and port, Versus checks the device itself, applies the remediation behind an approval, and closes the Entuity incident with the ticket number in the annotation. The Generate with AI button in the Workflow Builder knows these methods, so "close the Entuity incident for this device after the port comes back up" produces a working workflow.
find_device() and inventory() return:
| Key | Example |
|---|---|
id, name, polled_name, management_ip | 107, tor-core-sw-01, 10.10.1.1, 10.10.1.1 |
device_type, management_level, capabilities | Ethernet Switch, FULL, Switching & Routing |
sys_description, sys_location, sys_oid, snmp_type | Cisco IOS XE … 17.9.4a, Toronto DC, .1.3.6.1.4.1.9.1.2494, v3 |
sw_id, config_management | 1001 (the StormWorks id used by ports / attributes), true |
incidents() and incidents_for() return {id, description, details, severity, severity_label, source, impact, opened, state, annotation, event_count, sw_id}; events() returns the same without state and with time instead of opened.
Two read-only expert tools are available to the Diagnostics AutoPilot and to agents that inherit its toolbox:
entuity_incidents — open incidents for a device by IP or name (or the most severe open incidents overall), with an optional minimum severity.entuity_device — Entuity's inventory record for a device plus its admin-up / operationally-down ports.A path-check that stalls at "the client cannot reach the VIP" can now continue with "Entuity has had Port Operationally Down open on tor-core-sw-01 Gi1/0/24 for 18 minutes, isolating tor-access-sw-04", which is usually the actual answer.
Running manage.py seed_entuity_demo (or the full seed_demo) creates an Entuity (Demo) source flagged as a demo. It answers from a representative sample deployment — one ENA server, 24 monitored devices across Toronto and Montréal (the demo Check Point pair, ProxySG pair and Zscaler Private Service Edges plus the core and access switches, edge routers, WLC, firewall and UPS a monitoring platform would also know), eight Views, a day of events and eight open incidents including a critical unreachable switch, a severe BGP peer loss and a port down that isolates an access switch — so the surface is demonstrable before a real ENA server is connected. Reconcile shows real matches against the Versus demo inventory and real gaps. Actions on the demo source are simulated and say so.
Real sources never fall back to sample data: if ENA cannot be reached, the tab, the SDK call and the AutoPilot tool report the error.
updateId cursors for incremental polling; the SDK exposes the same update_id parameter.PUT incidents/{id} with state / annotation; raising an event uses POST events. Both need an Entuity user with the matching permissions.serverId qualifier is reported on every record.entuity_incidents tool lives