def get_appliance_info(
    self,
    ne_pk: str,
) -> dict:
    """Get appliance information

    .. list-table::
        :header-rows: 1

        * - Swagger Section
          - Method
          - Endpoint
        * - appliance
          - GET
          - /appliance/{nePk}

    :param ne_pk: Network Primary Key (nePk) of existing appliance,
        e.g. ``3.NE``
    :type ne_pk: str
    :return: Returns dictionary of appliance information \n
        * keyword **id** (`str`): This is the primary key of the
          appliance. Every appliance managed by Orchestrator is given a
          primary key and it uniquely identifies an appliance among all
          appliances managed by Orchestrator
        * keyword **uuid** (`str`): This is also an unique identifier.
          It is generated and self assigned by the appliance itself.
        * keyword **networkRole** (`str`): The network role the
          appliance is configured in Orchestrator. spoke = ``0``,
          hub = ``1``, mesh = ``2``
        * keyword **site** (`str`): An identifier used to tag an
          appliance with a site name
        * keyword **sitePriority** (`int`): Priority given to the
          appliance with the site it belongs to
        * keyword **userName** (`str`): User name used to login to
          appliance
        * keyword **password** (`str`): Password used to login to
          appliance. They are not returned for security reasons
        * keyword **groupId** (`str`): Primary key identifier of the
          Orchestrator group the appliance belongs to
        * keyword **IP** (`str`): IP Address of the appliance
        * keyword **webProtocolType** (`int`): Protocol used by
          Orchestrator to talk to appliance. Http = ``1``,
          Https = ``2``, Both = 3
        * keyword **serial** (`str`): Serial number of the appliance
        * keyword **hasUnsavedChanges** (`bool`): If ``True``, there are
          unsaved changes on the appliance
        * keyword **rebootRequired** (`bool`): If ``True``, the
          applianceappliance requires areboot
        * keyword **model** (`str`): Appliance model. Eg: EC-XS
        * keyword **hardwareRevision** (`str`): Hardware revision of the
          appliance. e.g. ``200193-004 Rev A``
        * keyword **hostName** (`str`): Appliance hostname
        * keyword **applianceId** (`str`): This is yet another
          identifier of the appliance. But it is mainly used by the
          appliance to identify its peer
        * keyword **mode** (`str`): Deployment mode the appliance is
          configured in
        * keyword **bypass** (`bool`): If ``True``, appliance is
          currently in bypass
        * keyword **softwareVersion** (`str`): Software version running
          on the appliance
        * keyword **startupTime** (`int`): No description in Swagger
        * keyword **webProtocol** (`str`): String version of the
          protocol field. Possible values are ``BOTH``, ``HTTP``, and
          ``HTTPS``
        * keyword **systemBandwidth** (`int`): Appliance system
          bandwidth, in Kbps
        * keyword **state** (`int`): State of the appliance. ``0`` -
          Unknown ( When an appliance is added to Orchestrator, it is in
          this state ),
          ``1`` - Normal (Appliance is reachable from Orchestrator),
          ``2`` - Unreachable (Appliance is unreachable from
          Orchestrator),
          ``3`` - Unsupported Version (Orchestrator does not support
          this version of the appliance ),
          ``4`` - Out of Synchronization (Orchestrator's cache of
          appliance configuration/state is out of sync with the
          configuration/state on the appliance),
          ``5`` - Synchronization in Progress (Orchestrator is currently
          synchronizing appliances's configuration and state)
        * keyword **dynamicUuid** (`str`): No description in Swagger
        * keyword **portalObjectId** (`str`): No description in Swagger
        * keyword **discoveredFrom** (`int`): How the appliance was
          added to Orchestrator. ``1`` = MANUAL, ``2`` = PORTAL, ``3`` =
          APPLIANCE
        * keyword **reachabilityChannel** (`int`): Reachability channel
          of the appliance. ``0`` - Unknown, ``1`` - Orchestrator talks
          to appliance using HTTP/HTTPS using user id and password. This
          is not used for EdgeConnects and SD-WAN, ``2`` - Appliance
          connects to Orchestrator using HTTPS Websocket. Orchestrator
          uses this permanent connection to configure/monitor appliance.
          This is done because Appliance may be behind a firewall making
          it hard for Orchestrator to contact appliance using IP
          address, ``4`` - Orchestrator sends configuration/monitoring
          request to Cloud Portal which relays those requests to
          Appliance. Appliance sends its response to Cloud Portal which
          relays it back to Orchestrator.
        * keyword **ip** (`str`): Same as IP field
        * keyword **nePk** (`str`): same as ID field
        * keyword **zoneList** (`dict`): dictionary of list of zones
          being used by appliance \n
            * keyword **zones** (`list[str]`): list of zones
        * keyword **interfaceList** (`dict`): dictionary of list of
          interface labels being used by appliance \n
            * keyword **interfaceLabels** (`list[str]`): list of
              interface numbers
        * keyword **tagsList** (`list`): No description in Swagger
    :rtype: dict
    :raises ValueError: Checks format of provided NePK value containing
        ".NE"
    """
    valid = ".NE"
    if valid not in ne_pk:
        raise ValueError(
            "nePk must be in format '0.NE', but %r was provided" % ne_pk
        )

    return self._get("/appliance/{}".format(ne_pk))