-
Notifications
You must be signed in to change notification settings - Fork 2
Description
Problem description
Current Wi-Fi AccessDetail schemas (WiFiWpaPersonalAccessDetail, WiFiWpaEnterpriseAccessDetail) make ssid optional without an explicit intent field. The server infers semantics (create new SSID vs associate with existing vs infer default) from presence/absence of ssid, which is:
- Ambiguous for clients.
- Not machine‑enforceable (no conditional validation in schema).
- Hard to extend
- Requires out‑of‑band documentation for “inference” vs “explicit targeting”.
Expected behavior
Introduce an explicit intent field (e.g. ssidIntent enum: create, existing) in Wi-Fi access detail variants:
create⇒ssidrequired (provision new SSID).existing⇒ssidoptional (present = explicit association; absent = inference attempt).
Update:
- Schemas with
oneOfblocks enforcing conditional requirements. - Capabilities model to surface supportedSsidIntents (and optionally inferenceSupported).
- Examples: provide both create and existing (with and without ssid).
- Documentation: clarify error codes when inference fails (e.g. 422 INFERENCE_FAILED).
Example:
// ...existing code...
WiFiWpaPersonalAccessDetail:
type: object
additionalProperties: false
properties:
accessType:
type: string
enum: ["Wi-Fi:WPA_PERSONAL"]
example: "Wi-Fi:WPA_PERSONAL"
ssidIntent:
type: string
enum: [create, existing]
description: |
Intent for SSID handling.
- create: provision a new SSID (ssid required).
- existing: associate with an existing SSID. ssid optional:
* provided => explicit target SSID.
* omitted => server attempts inference (fails if ambiguous or unsupported).
ssid:
type: string
minLength: 2
maxLength: 32
description: |
SSID name.
Required when ssidIntent=create.
Optional when ssidIntent=existing (present for explicit targeting; omitted for inference).
example: *wifi-ssid
securityMode:
allOf:
- $ref: "#/components/schemas/WpaPersonalDetail"
example: *wpa-personal
required:
- accessType
- ssidIntent
- securityMode
oneOf:
- required: [ssidIntent, ssid]
properties:
ssidIntent:
enum: [create]
- required: [ssidIntent]
properties:
ssidIntent:
enum: [existing]
example: &wifi-wpa-personal-access-detail
accessType: "Wi-Fi:WPA_PERSONAL"
ssidIntent: create
ssid: *wifi-ssid
securityMode: *wpa-personal
WiFiWpaEnterpriseAccessDetail:
type: object
additionalProperties: false
properties:
accessType:
type: string
enum: ["Wi-Fi:WPA_ENTERPRISE"]
example: "Wi-Fi:WPA_ENTERPRISE"
ssidIntent:
type: string
enum: [create, existing]
description: Same semantics as in WiFiWpaPersonalAccessDetail.
ssid:
type: string
minLength: 2
maxLength: 32
description: Required when ssidIntent=create; optional when ssidIntent=existing.
example: *wifi-ssid
securityMode:
allOf:
- $ref: "#/components/schemas/WpaEnterpriseDetail"
example: *wpa-enterprise
required:
- accessType
- ssidIntent
- securityMode
oneOf:
- required: [ssidIntent, ssid]
properties:
ssidIntent:
enum: [create]
- required: [ssidIntent]
properties:
ssidIntent:
enum: [existing]
additionalProperties: false
example: &wifi-wpa-enterprise-access-detail
accessType: "Wi-Fi:WPA_ENTERPRISE"
ssidIntent: existing
ssid: *wifi-ssid
securityMode: *wpa-enterprise
// ...existing code...Alternative solution
- Boolean flag (createSsid: true|false) instead of enum.
- Expand accessType values (e.g. Wi-Fi:WPA_PERSONAL:CREATE, Wi-Fi:WPA_PERSONAL:EXISTING) removing need for extra field (more enum sprawl).
- Pure documentation only (keep schema as‑is; rely on server validation) — simplest but keeps ambiguity.
- Add separate endpoints for SSID provisioning vs association (splits concerns, more surface area).
Additional context
The change supports future extensibility and improves client pre‑validation, reduces trial‑and‑error, and aligns with capabilities-driven discovery. Current optional ssid pattern is already being questioned while refining AccessDetail; deferring now risks a later breaking change. Introducing an explicit intent early stabilizes the contract.