Skip to content

Add SSID Intent to AccessDetail model #92

@clundie-CL

Description

@clundie-CL

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:

  • createssid required (provision new SSID).
  • existingssid optional (present = explicit association; absent = inference attempt).

Update:

  • Schemas with oneOf blocks 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.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions