Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 8 additions & 8 deletions examples/cameraServiceExample.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
from uuid import uuid4

from common_utility import InterfaceResolver
from context_logger import get_logger, setup_logging

from examples import setup_shutdown
from hello import ServiceInfo, Hello, Group, GroupUrl
from hello import ServiceInfo, Hello, Group

setup_logging('hello')

Expand All @@ -13,17 +14,16 @@
def main() -> None:
shutdown_event = setup_shutdown()

# Define the group URL optionally specifying the network interface
url = GroupUrl(address='239.0.1.1', port=5555, interface='wlan0')
# Resolve the address for the specified interface name (e.g., 'wlan0')
if_address = InterfaceResolver().resolve('wlan0')

# Define the group to advertise the camera service on
group = Group.create(name='effective-range/sniper', url=url)
group = Group.create(name='effective-range/sniper', address='239.0.1.1', port=5555, if_address=if_address)

# Define the service information for the camera
hostname = 'er-sniper-camera-1'
info = ServiceInfo(uuid=uuid4(), name=hostname, role='camera', urls={
'api': f'grpc://{hostname}.local:50051',
'stream': f'http://{hostname}.local:8000'
info = ServiceInfo(uuid=uuid4(), name='er-sniper-camera-1', role='camera', urls={
'api': f'grpc://{if_address}:50051',
'stream': f'http://{if_address}:8000/video_feed'
})

# Use a scheduled advertizer to periodically announce the camera service
Expand Down
24 changes: 3 additions & 21 deletions hello/group.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,25 +5,6 @@
from dataclasses import dataclass
from enum import Enum

import netifaces


@dataclass
class GroupUrl:
address: str
port: int
protocol: str = 'udp'
interface: str | None = None

def resolve(self) -> str:
if self.interface and self.interface in netifaces.interfaces():
inet_address = netifaces.ifaddresses(self.interface).get(netifaces.AF_INET)
if inet_address and len(inet_address) > 0:
address = inet_address[0].get('addr')
return f'{self.protocol}://{address};{self.address}:{self.port}'

return f'{self.protocol}://{self.address}:{self.port}'


class GroupPrefix(Enum):
HELLO = 'hello'
Expand All @@ -42,8 +23,9 @@ def query(self) -> 'PrefixedGroup':
return PrefixedGroup(GroupPrefix.QUERY, self)

@staticmethod
def create(name: str, url: GroupUrl) -> 'Group':
return Group(name, url.resolve())
def create(name: str, address: str, port: int, protocol: str = 'udp', if_address: str | None = None) -> 'Group':
if_address = f'{if_address};' if if_address else ''
return Group(name, f'{protocol}://{if_address}{address}:{port}')


@dataclass
Expand Down
3 changes: 1 addition & 2 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,14 @@ maintainers = [
{ name = "Ferenc Nandor Janky & Attila Gombos", email = "info@effective-range.com" }
]
dependencies = [
"netifaces",
"pyzmq @ git+https://github.com/EffectiveRange/pyzmq.git@v27.1.0+drafts1",
"python-context-logger @ git+https://github.com/EffectiveRange/python-context-logger.git@latest",
"python-common-utility @ git+https://github.com/EffectiveRange/python-common-utility.git@latest"
]
dynamic = ["version"]

[tool.setuptools]
package-dir = {"" = "."}
package-dir = { "" = "." }
packages = ["hello", "examples"]

[tool.setuptools.package-data]
Expand Down
40 changes: 7 additions & 33 deletions tests/groupTest.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

from context_logger import setup_logging

from hello import GroupUrl, Group
from hello import Group


class GroupTest(TestCase):
Expand All @@ -15,45 +15,19 @@ def setUpClass(cls):
def setUp(self):
print()

def test_url_resolves_when_interface_is_not_provided(self):
# Given
group_url = GroupUrl(protocol='udp', address='239.0.1.1', port=5555)

# When
url = group_url.resolve()

# Then
self.assertEqual('udp://239.0.1.1:5555', url)

def test_url_resolves_when_interface_is_provided(self):
# Given
group_url = GroupUrl(protocol='udp', address='239.0.1.1', port=5555, interface='lo')

def test_group_created(self):
# When
url = group_url.resolve()
group = Group.create(name='test-group', address='239.0.1.1', port=5555)

# Then
self.assertEqual('udp://127.0.0.1;239.0.1.1:5555', url)

def test_url_resolves_when_interface_is_provided_but_not_exists(self):
# Given
group_url = GroupUrl(protocol='udp', address='239.0.1.1', port=5555, interface='nonexistent0')

# When
url = group_url.resolve()

# Then
self.assertEqual('udp://239.0.1.1:5555', url)

def test_group_created_with_resolved_url(self):
# Given
group_url = GroupUrl(address='239.0.1.1', port=5555, interface='lo')
self.assertEqual(Group(name='test-group', url='udp://239.0.1.1:5555'), group)

def test_group_created_when_interface_address_is_provided(self):
# When
group = Group.create('test-group', group_url)
group = Group.create(name='test-group', address='239.0.1.1', port=5555, if_address='192.168.0.100')

# Then
self.assertEqual(Group(name='test-group', url='udp://127.0.0.1;239.0.1.1:5555'), group)
self.assertEqual(Group(name='test-group', url='udp://192.168.0.100;239.0.1.1:5555'), group)

def test_prefixed_group_created_with_hello_prefix(self):
# Given
Expand Down
Loading