Skip to content
Draft
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
41 changes: 18 additions & 23 deletions landscape/client/broker/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,22 +52,14 @@
from landscape.lib.twisted_util import gather_results


def event(method):
"""Turns a L{BrokerServer} method into an event broadcaster.

When the decorated method is called, an event is fired on all connected
clients. The event will have the same name as the method being called,
except that any underscore in the method name will be replaced with a dash.
def broadcast_event(event_type, clients, *args, **kwargs):
"""
event_type = method.__name__.replace("_", "-")

def broadcast_event(self, *args, **kwargs):
fired = []
for client in self.get_clients():
fired.append(client.fire_event(event_type, *args, **kwargs))
return gather_results(fired)

return broadcast_event
Fire an event on all provided clients.
"""
fired = []
for client in clients:
fired.append(client.fire_event(event_type, *args, **kwargs))
return gather_results(fired)


class BrokerServer:
Expand Down Expand Up @@ -315,13 +307,13 @@ def schedule_reactor_stop(ignored):

return clients_stopped.addBoth(schedule_reactor_stop)

@event
def resynchronize(self):
def resynchronize(self, scopes=None):
"""Broadcast a C{resynchronize} event to the clients."""
return broadcast_event("resynchronize", self.get_clients(), scopes=scopes)

@event
def impending_exchange(self):
"""Broadcast an C{impending-exchange} event to the clients."""
return broadcast_event("impending-exchange", self.get_clients())

@remote
def listen_events(self, event_types):
Expand All @@ -345,21 +337,24 @@ def handler(**kwargs):
calls.append(call)
return deferred

@event
def broker_reconnect(self):
"""Broadcast a C{broker-reconnect} event to the clients."""
return broadcast_event("broker-reconnect", self.get_clients())

@event
def server_uuid_changed(self, old_uuid, new_uuid):
"""Broadcast a C{server-uuid-changed} event to the clients."""
return broadcast_event(
"server-uuid-changed", self.get_clients(), old_uuid, new_uuid
)

@event
def message_type_acceptance_changed(self, type, accepted):
pass
return broadcast_event(
"message-type-acceptance-changed", self.get_clients(), type, accepted
)

@event
def package_data_changed(self):
"""Fire a package-data-changed event in the reactor of each client."""
return broadcast_event("package-data-changed", self.get_clients())

def broadcast_message(self, message):
"""Call the C{message} method of all the registered plugins.
Expand Down
5 changes: 2 additions & 3 deletions landscape/client/broker/tests/test_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -454,8 +454,7 @@ def test_resynchronize(self):
callback = Mock(return_value="foo")
self.client_reactor.call_on("resynchronize", callback)
return self.assertSuccess(
self.broker.resynchronize(["foo"]),
[["foo"]],
self.broker.resynchronize(scopes=["somescope"]), [["foo"]]
)

def test_impending_exchange(self):
Expand Down Expand Up @@ -658,4 +657,4 @@ def test_resynchronize_clients(self):
"""
self.client.fire_event = Mock(return_value=succeed(None))
self.reactor.fire("resynchronize-clients")
self.client.fire_event.assert_called_once_with("resynchronize")
self.client.fire_event.assert_called_once_with("resynchronize", scopes=None)