Skip to content

Flow graph and route matrix

The flow graph and the route matrix expose the same data in two views: every reachable path from a SCIM group to an application segment.

Endpoints

MethodPathPurpose
POST/api/v1/graphFiltered graph for the selection in the request body.
GET/api/v1/routesFull route matrix across all SCIM groups and segments.

Graph structure

Five columns, left to right:

flowchart LR
    A[SCIM groups] --> B[Access policies]
    B --> C[Connector groups]
    C --> D[Segment groups]
    D --> E[Segments]

Edge semantics

EdgeSource data
SCIM group → policyPolicy condition with operand ObjectType = SCIM_GROUP referencing the SCIM group ID on RHS.
Policy → connector groupPolicy targets a server group bound to the connector group.
Policy → segment groupPolicy condition with operand ObjectType = APP_GROUP referencing the segment group ID.
Policy → segmentPolicy condition with operand ObjectType = APP referencing the segment ID directly.
Segment group → segmentZPA’s one-to-one constraint: a segment belongs to exactly one segment group.

Selecting a node highlights every path the node participates in. The request body of POST /api/v1/graph scopes the returned graph to one starting node or one segment.

Route matrix

GET /api/v1/routes returns the full enumeration:

type RouteMatrix struct {
Routes []Route
}
type Route struct {
ScimGroupID string
ScimGroupName string
PolicyID string
PolicyName string
Action string // ALLOW | DENY | DEFAULT_DENY
SegmentID string
SegmentName string
SegmentGroupID string
ConnectorGroupIDs []string
}

The UI renders the matrix as a filterable table. Selecting any cell value filters the table to other routes that share the value.

Common queries

QuestionFilter
Which SCIM groups can reach segment X?Filter by SegmentID, read ScimGroupName.
Which segments can SCIM group Y reach?Filter by ScimGroupID, read SegmentName.
Which policies cover only one route?Sort by PolicyID, count routes per policy, inspect single-row policies.

Implementation

internal/analysis/flow.go builds the route set by traversing the inverted indexes from the index layer. No SDK calls. Cost is one map walk per dimension.