nanover.essd.servicehub module

Module defining a Service.

class nanover.essd.servicehub.ServiceHub(**properties)

Bases: object

A definition of a ServiceHub that can be discovered or broadcast.

A service hub consists of properties that must at least consist of a name and ip address. The payload can optionally include additional information on the services provided.

Param:

name: The name of the service hub.

Param:

address: The address of the service hub.

Param:

id: The unique ID of the service hub. If not specified, it will be generated.

Param:

essd_version: The version of ESSD this service hub uses. If not specified it will be determined automatically.

Param:

services: Dictionary of service names and their ports. Standard NanoVer services include imd, trajectory, multiplayer and builder.

Example

>>> # the ID field is usually autogenerated, provided here for completeness.
>>> hub = ServiceHub(name="Example NanoVer Service Hub", address="localhost", id="12345")
>>> hub.add_service("imd", 54322)
>>> hub.add_service("trajectory", 54323)
>>> hub.services
{'imd': 54322, 'trajectory': 54323}
>>> hub.message
'{"name": "Example NanoVer Service Hub", "address": "localhost", "id": "12345", "essd_version": "1.0.0", "services": {"imd": 54322, "trajectory": 54323}}'

The IP address of a service can either be a specific IP address of the interface to be broadcast, or it can be one of two special values: localhost or [::].

If localhost is specified, it will be broadcasted as running at 127.0.0.1, which is the usual translation of such a definition.

If [::] is specified, then the appropriate IP address will be broadcast for each interface on the system.

Example

Consider a system with two interfaces, with IP addresses 192.168.1.2 (e.g. ethernet), and 72.34.5.5 (e.g. wireless), and broadcast addresses 192.168.1.255 and 72.34.255.255 respectively. The address [::] is provided. Then the service will be broadcast at as being at 192.168.1.2 on the ethernet network, and as being at 72.34.5.5 on the second network. Thus, a client at on the ethernet network will receive the address 192.168.1.2, which it can route to.

add_service(name, port)

Adds a service with the given name and port to the service hub definition.

Parameters:
  • name – Name of the service

  • port – Port at which the service is running

property address

The IP address of the service hub.

Returns:

The IP address of the service hub.

Raises:

KeyError – if name has not been set.

classmethod from_json(json_properties)

Constructs an instance of ServiceHub from the given json string.

Parameters:

json_properties – The JSON string containing the properties of the ServiceHub

Returns:

An instance of ServiceHub

Raises`KeyError`:

if the properties do not contain required fields, name and address.

get_service_address(service_name: str) Tuple[str, int] | None

Gets the address and port of a service, if it exists. :param service_name: Service name :return: Tuple consisting of address and port of a service, or None if not found.

property id

Gets the unique ID string of this service hub.

Returns:

The unique ID string of this service hub.

property message

Returns the message that represents this service hub as a JSON string.

Returns:

The message representing this service hub, as a JSON string.

property name

The name of the service hub.

Returns:

The name of the service hub.

Raises:

KeyError – if name has not been set.

property services

Gets the services registered at this service hub.

Returns:

Dictionary of service definitions.

to_message(override_address: str | None = None) str

Returns the JSON message representing this service hub, with the option to override this address.

Parameters:

override_address – The address to override in the resulting message.

Returns:

JSON message representing this service hub.

When broadcasting services, it is useful to be able to provide human-readable shortcuts for underlying addresses, but clients receiving broadcasting need to know the actual address the service hub is running at.

A typical use case is when using the ‘[::]’ notation for defining a gRPC service, which means it will listen on all interfaces. When it comes to broadcasting, the discovery server will broadcast on all interfaces with the correct address for that interface.

>>> hub = ServiceHub(name='Example', address='[::]', id='12345')
>>> # The resulting message is not particularly useful.
>>> hub.message
'{"name": "Example", "address": "[::]", "id": "12345"}'
>>> # Instead, at transmission, override with an actual address for the target interface.
>>> hub.to_message(override_address="192.168.1.15")
'{"name": "Example", "address": "192.168.1.15", "id": "12345"}'
property version

Gets the version of ESSD this service hub is compatible with.

Returns:

Version string of this service hub.