diff -Nru landscape-client-14.12/debian/changelog landscape-client-14.12/debian/changelog --- landscape-client-14.12/debian/changelog 2014-12-12 17:24:17.000000000 +0000 +++ landscape-client-14.12/debian/changelog 2016-01-18 15:48:46.000000000 +0000 @@ -1,3 +1,10 @@ +landscape-client (14.12-0ubuntu3.15.10) wily; urgency=medium + + * Add debian/patches/fix-users-reporting.patch to fix a + regression in users reporting (LP: #1508110) + + -- Andreas Hasenack Mon, 18 Jan 2016 13:06:05 -0200 + landscape-client (14.12-0ubuntu1) vivid; urgency=medium * New upstream version: diff -Nru landscape-client-14.12/debian/patches/fix-users-reporting-take2.patch landscape-client-14.12/debian/patches/fix-users-reporting-take2.patch --- landscape-client-14.12/debian/patches/fix-users-reporting-take2.patch 1970-01-01 00:00:00.000000000 +0000 +++ landscape-client-14.12/debian/patches/fix-users-reporting-take2.patch 2016-01-18 15:05:34.000000000 +0000 @@ -0,0 +1,242 @@ +--- a/landscape/broker/client.py ++++ b/landscape/broker/client.py +@@ -1,6 +1,6 @@ + from logging import info, exception + +-from twisted.internet.defer import maybeDeferred ++from twisted.internet.defer import maybeDeferred, succeed + + from landscape.log import format_object + from landscape.lib.twisted_util import gather_results +@@ -67,7 +67,7 @@ + """ + if not (scopes is None or self.scope in scopes): + # This resynchronize event is out of scope for us. Do nothing +- return ++ return succeed(None) + + # Because the broker will drop session IDs already associated to scope + # of the resynchronisation, it isn't safe to send messages until the +--- a/landscape/broker/tests/test_client.py ++++ b/landscape/broker/tests/test_client.py +@@ -47,6 +47,17 @@ + self.client.add(plugin) + self.assertEqual(test_session_id, plugin._session_id) + ++ def test_resynchronizing_out_of_scope(self): ++ """ ++ When a 'reysnchronize' event happens and the plugin scope is not part ++ of the scopes that were passed, BrokerClientPlugin succeeds. ++ """ ++ plugin = BrokerClientPlugin() ++ plugin.scope = "foo" ++ self.client.add(plugin) ++ deferred = self.client_reactor.fire("resynchronize", scopes=["bar"])[0] ++ self.assertIsNone(self.successResultOf(deferred)) ++ + def test_resynchronizing_refreshes_session_id(self): + """ + When a 'reysnchronize' event fires a new session ID is acquired as the +--- a/landscape/monitor/tests/test_usermonitor.py ++++ b/landscape/monitor/tests/test_usermonitor.py +@@ -23,13 +23,13 @@ + def got_result(result): + self.assertMessages( + self.broker_service.message_store.get_pending_messages(), +- [{"create-group-members": {u"webdev":[u"jdoe"]}, ++ [{"create-group-members": {u"webdev": [u"jdoe"]}, + "create-groups": [{"gid": 1000, "name": u"webdev"}], + "create-users": [{"enabled": True, "home-phone": None, + "location": None, "name": u"JD", + "primary-gid": 1000, "uid": 1000, + "username": u"jdoe", "work-phone": None}], +- "type": "users"}]) ++ "type": "users"}]) + plugin.stop() + + users = [("jdoe", "x", 1000, 1000, "JD,,,,", "/home/jdoe", "/bin/sh")] +@@ -91,20 +91,20 @@ + self.assertTrue(persist.get("groups")) + self.assertMessages( + self.broker_service.message_store.get_pending_messages(), +- [{"create-group-members": {u"webdev":[u"jdoe"]}, ++ [{"create-group-members": {u"webdev": [u"jdoe"]}, + "create-groups": [{"gid": 1000, "name": u"webdev"}], + "create-users": [{"enabled": True, "home-phone": None, + "location": None, "name": u"JD", + "primary-gid": 1000, "uid": 1000, + "username": u"jdoe", "work-phone": None}], +- "type": "users"}]) ++ "type": "users"}]) + self.broker_service.message_store.delete_all_messages() + deferred = self.monitor.reactor.fire( + "resynchronize", scopes=["users"])[0] + self.successResultOf(deferred) + self.assertMessages( + self.broker_service.message_store.get_pending_messages(), +- [{"create-group-members": {u"webdev":[u"jdoe"]}, ++ [{"create-group-members": {u"webdev": [u"jdoe"]}, + "create-groups": [{"gid": 1000, "name": u"webdev"}], + "create-users": [{"enabled": True, "home-phone": None, + "location": None, "name": u"JD", +@@ -113,6 +113,29 @@ + "work-phone": None}], + "type": "users"}]) + ++ def test_new_message_after_resynchronize_event(self): ++ """ ++ When a 'resynchronize' reactor event is fired, a new session is ++ created and the UserMonitor creates a new message. ++ """ ++ self.provider.users = [("jdoe", "x", 1000, 1000, "JD,,,,", ++ "/home/jdoe", "/bin/sh")] ++ self.provider.groups = [("webdev", "x", 1000, ["jdoe"])] ++ self.broker_service.message_store.set_accepted_types(["users"]) ++ self.monitor.add(self.plugin) ++ self.plugin.client.broker.message_store.drop_session_ids() ++ deferred = self.reactor.fire("resynchronize")[0] ++ self.successResultOf(deferred) ++ self.assertMessages( ++ self.broker_service.message_store.get_pending_messages(), ++ [{"create-group-members": {u"webdev": [u"jdoe"]}, ++ "create-groups": [{"gid": 1000, "name": u"webdev"}], ++ "create-users": [{"enabled": True, "home-phone": None, ++ "location": None, "name": u"JD", ++ "primary-gid": 1000, "uid": 1000, ++ "username": u"jdoe", "work-phone": None}], ++ "type": "users"}]) ++ + def test_wb_resynchronize_event_with_global_scope(self): + """ + When a C{resynchronize} event, with global scope, occurs we act exactly +@@ -129,19 +152,19 @@ + self.assertTrue(persist.get("groups")) + self.assertMessages( + self.broker_service.message_store.get_pending_messages(), +- [{"create-group-members": {u"webdev":[u"jdoe"]}, ++ [{"create-group-members": {u"webdev": [u"jdoe"]}, + "create-groups": [{"gid": 1000, "name": u"webdev"}], + "create-users": [{"enabled": True, "home-phone": None, + "location": None, "name": u"JD", + "primary-gid": 1000, "uid": 1000, + "username": u"jdoe", "work-phone": None}], +- "type": "users"}]) ++ "type": "users"}]) + self.broker_service.message_store.delete_all_messages() + deferred = self.monitor.reactor.fire("resynchronize")[0] + self.successResultOf(deferred) + self.assertMessages( + self.broker_service.message_store.get_pending_messages(), +- [{"create-group-members": {u"webdev":[u"jdoe"]}, ++ [{"create-group-members": {u"webdev": [u"jdoe"]}, + "create-groups": [{"gid": 1000, "name": u"webdev"}], + "create-users": [{"enabled": True, "home-phone": None, + "location": None, "name": u"JD", +@@ -166,7 +189,7 @@ + self.assertTrue(persist.get("groups")) + self.assertMessages( + self.broker_service.message_store.get_pending_messages(), +- [{"create-group-members": {u"webdev":[u"jdoe"]}, ++ [{"create-group-members": {u"webdev": [u"jdoe"]}, + "create-groups": [{"gid": 1000, "name": u"webdev"}], + "create-users": [{"enabled": True, "home-phone": None, + "location": None, "name": u"JD", +@@ -189,13 +212,13 @@ + def got_result(result): + self.assertMessages( + self.broker_service.message_store.get_pending_messages(), +- [{"create-group-members": {u"webdev":[u"jdoe"]}, ++ [{"create-group-members": {u"webdev": [u"jdoe"]}, + "create-groups": [{"gid": 1000, "name": u"webdev"}], + "create-users": [{"enabled": True, "home-phone": None, + "location": None, "name": u"JD", + "primary-gid": 1000, "uid": 1000, + "username": u"jdoe", "work-phone": None}], +- "type": "users"}]) ++ "type": "users"}]) + + self.provider.users = [("jdoe", "x", 1000, 1000, "JD,,,,", + "/home/jdoe", "/bin/sh")] +@@ -230,14 +253,14 @@ + def got_result(result): + self.assertMessages( + self.broker_service.message_store.get_pending_messages(), +- [{"create-group-members": {u"webdev":[u"jdoe"]}, ++ [{"create-group-members": {u"webdev": [u"jdoe"]}, + "create-groups": [{"gid": 1000, "name": u"webdev"}], + "create-users": [{"enabled": True, "home-phone": None, + "location": None, "name": u"JD", + "primary-gid": 1000, "uid": 1000, + "username": u"jdoe", "work-phone": None}], +- "operation-id": 1001, +- "type": "users"}]) ++ "operation-id": 1001, ++ "type": "users"}]) + + self.provider.users = [("jdoe", "x", 1000, 1000, "JD,,,,", + "/home/jdoe", "/bin/sh")] +@@ -253,12 +276,12 @@ + def got_result(result): + self.assertMessages( + self.broker_service.message_store.get_pending_messages(), +- [{"create-group-members": {u"webdev":[u"jdoe"]}, ++ [{"create-group-members": {u"webdev": [u"jdoe"]}, + "create-groups": [{"gid": 1000, "name": u"webdev"}], + "create-users": [{"enabled": True, "home-phone": None, + "location": None, "name": u"JD", + "primary-gid": 1000, "uid": 1000, +- "username": u"jdoe", "work-phone": None}], ++ "username": u"jdoe", "work-phone": None}], + "type": "users"}]) + + self.broker_service.message_store.set_accepted_types(["users"]) +@@ -283,7 +306,7 @@ + def got_result(result): + self.assertMessages( + self.broker_service.message_store.get_pending_messages(), +- [{"create-group-members": {u"webdev":[u"jdoe"]}, ++ [{"create-group-members": {u"webdev": [u"jdoe"]}, + "create-groups": [{"gid": 1000, "name": u"webdev"}], + "create-users": [{"enabled": True, "home-phone": None, + "location": None, "name": u"JD", +@@ -332,8 +355,9 @@ + + def got_result(result): + mstore = self.broker_service.message_store +- self.assertMessages(mstore.get_pending_messages(), +- [{"create-group-members": {u"webdev":[u"jdoe"]}, ++ self.assertMessages( ++ mstore.get_pending_messages(), ++ [{"create-group-members": {u"webdev": [u"jdoe"]}, + "create-groups": [{"gid": 1000, "name": u"webdev"}], + "create-users": [{"enabled": True, "home-phone": None, + "location": None, "name": u"JD", +@@ -376,7 +400,7 @@ + self.mocker.replay() + + self.provider.users = [("jdoe", "x", 1000, 1000, "JD,,,,", +- "/home/jdoe", "/bin/sh")] ++ "/home/jdoe", "/bin/sh")] + self.provider.groups = [("webdev", "x", 1000, ["jdoe"])] + self.monitor.add(self.plugin) + connector = RemoteUserMonitorConnector(self.reactor, self.config) +--- a/landscape/monitor/usermonitor.py ++++ b/landscape/monitor/usermonitor.py +@@ -39,10 +39,14 @@ + self._publisher.stop() + self._publisher = None + +- def _reset(self): ++ def _resynchronize(self, scopes=None): + """Reset user and group data.""" +- super(UserMonitor, self)._reset() +- return self._run_detect_changes() ++ deferred = super(UserMonitor, self)._resynchronize(scopes=scopes) ++ # Wait for the superclass' asynchronous _resynchronize method to ++ # complete, so we have a new session ID at hand and we can craft a ++ # valid message (l.broker.client.BrokerClientPlugin._resynchronize). ++ deferred.addCallback(lambda _: self._run_detect_changes()) ++ return deferred + + @remote + def detect_changes(self, operation_id=None): diff -Nru landscape-client-14.12/debian/patches/series landscape-client-14.12/debian/patches/series --- landscape-client-14.12/debian/patches/series 1970-01-01 00:00:00.000000000 +0000 +++ landscape-client-14.12/debian/patches/series 2016-01-18 15:05:20.000000000 +0000 @@ -0,0 +1 @@ +fix-users-reporting-take2.patch