6
7
from twisted.internet.defer import Deferred
7
8
from twisted.internet import reactor
9
10
from landscape.lib.fetch import fetch_async, FetchError
10
from landscape.lib.command import CommandError
12
11
from landscape.package.store import PackageStore, UnknownHashIDRequest
13
12
from landscape.package.reporter import (
14
PackageReporter, HASH_ID_REQUEST_TIMEOUT, main, find_reporter_command)
13
PackageReporter, HASH_ID_REQUEST_TIMEOUT, main, find_reporter_command,
14
PackageReporterConfiguration)
15
15
from landscape.package import reporter
16
16
from landscape.package.facade import SmartFacade
18
from landscape.deployment import Configuration
19
17
from landscape.broker.remote import RemoteBroker
21
18
from landscape.package.tests.helpers import (
22
19
SmartFacadeHelper, HASH1, HASH2, HASH3)
24
20
from landscape.tests.helpers import (
25
21
LandscapeIsolatedTest, RemoteBrokerHelper)
26
22
from landscape.tests.mocker import ANY
24
SAMPLE_LSB_RELEASE = "DISTRIB_CODENAME=codename\n"
27
class PackageReporterConfigurationTest(unittest.TestCase):
29
def test_force_smart_update_option(self):
31
The L{PackageReporterConfiguration} supports a '--force-smart-update'
34
config = PackageReporterConfiguration()
35
self.assertFalse(config.force_smart_update)
36
config.load(["--force-smart-update"])
37
self.assertTrue(config.force_smart_update)
29
40
class PackageReporterTest(LandscapeIsolatedTest):
965
996
[{"type": "packages",
966
997
"not-available-upgrades": [2]}])
968
self.assertEquals(sorted(self.store.get_available_upgrades()), [])
970
result = self.reporter.detect_changes()
999
self.assertEquals(self.store.get_available_upgrades(), [])
1001
result = self.reporter.detect_changes()
1002
return result.addCallback(got_result)
1004
def test_detect_changes_with_locked(self):
1006
If Smart indicates locked packages we didn't know about, report
1009
message_store = self.broker_service.message_store
1010
message_store.set_accepted_types(["packages"])
1012
self.facade.set_package_lock("name1")
1013
self.facade.set_package_lock("name2", ">=", "version2")
1015
self.store.set_hash_ids({HASH1: 1, HASH2: 2})
1016
self.store.add_available([1, 2])
1018
def got_result(result):
1019
self.assertMessages(message_store.get_pending_messages(),
1020
[{"type": "packages", "locked": [1, 2]}])
1021
self.assertEquals(sorted(self.store.get_locked()), [1, 2])
1023
result = self.reporter.detect_changes()
1024
return result.addCallback(got_result)
1026
def test_detect_changes_with_locked_and_ranges(self):
1028
Ranges are used when reporting changes to 3 or more locked packages
1029
having consecutive ids.
1031
message_store = self.broker_service.message_store
1032
message_store.set_accepted_types(["packages"])
1034
self.facade.set_package_lock("name1")
1035
self.facade.set_package_lock("name2", ">=", "version2")
1036
self.facade.set_package_lock("name3", "<", "version4")
1038
self.store.set_hash_ids({HASH1: 1, HASH2: 2, HASH3: 3})
1039
self.store.add_available([1, 2, 3])
1041
def got_result(result):
1042
self.assertMessages(message_store.get_pending_messages(),
1043
[{"type": "packages", "locked": [(1, 3)]}])
1044
self.assertEquals(sorted(self.store.get_locked()), [1, 2, 3])
1046
result = self.reporter.detect_changes()
1047
return result.addCallback(got_result)
1049
def test_detect_changes_with_locked_with_unknown_hash(self):
1051
Locked packages whose hashes are unknown don't get reported.
1053
self.facade.set_package_lock("name1")
1055
def got_result(result):
1056
self.assertEquals(self.store.get_locked(), [])
1058
result = self.reporter.detect_changes()
1059
return result.addCallback(got_result)
1061
def test_detect_changes_with_locked_and_previously_known(self):
1063
We don't report locked packages we already know about.
1065
message_store = self.broker_service.message_store
1066
message_store.set_accepted_types(["packages"])
1068
self.facade.set_package_lock("name1")
1069
self.facade.set_package_lock("name2", ">=", "version2")
1071
self.store.set_hash_ids({HASH1: 1, HASH2: 2})
1072
self.store.add_available([1, 2])
1073
self.store.add_locked([1])
1075
def got_result(result):
1076
self.assertMessages(message_store.get_pending_messages(),
1077
[{"type": "packages", "locked": [2]}])
1079
self.assertEquals(sorted(self.store.get_locked()), [1, 2])
1081
result = self.reporter.detect_changes()
1082
return result.addCallback(got_result)
1084
def test_detect_changes_with_not_locked(self):
1086
We report when a package was previously locked and isn't anymore.
1088
message_store = self.broker_service.message_store
1089
message_store.set_accepted_types(["packages"])
1091
self.store.set_hash_ids({HASH1: 1})
1092
self.store.add_available([1])
1093
self.store.add_locked([1])
1095
def got_result(result):
1096
self.assertMessages(message_store.get_pending_messages(),
1097
[{"type": "packages", "not-locked": [1]}])
1098
self.assertEquals(self.store.get_locked(), [])
1100
result = self.reporter.detect_changes()
1101
return result.addCallback(got_result)
1103
def test_detect_changes_with_not_locked_and_ranges(self):
1105
Ranges are used when reporting changes to 3 or more not locked packages
1106
having consecutive ids.
1108
message_store = self.broker_service.message_store
1109
message_store.set_accepted_types(["packages"])
1111
self.store.add_locked([1, 2, 3])
1113
self.store.set_hash_ids({HASH1: 1, HASH2: 2, HASH3: 3})
1114
self.store.add_available([1, 2, 3])
1116
def got_result(result):
1117
self.assertMessages(message_store.get_pending_messages(),
1118
[{"type": "packages", "not-locked": [(1, 3)]}])
1119
self.assertEquals(sorted(self.store.get_locked()), [])
1121
result = self.reporter.detect_changes()
1122
return result.addCallback(got_result)
1124
def test_detect_package_locks_changes_with_create_locks(self):
1126
If Smart indicates package locks we didn't know about, report
1129
message_store = self.broker_service.message_store
1130
message_store.set_accepted_types(["package-locks"])
1132
self.facade.set_package_lock("name")
1134
logging_mock = self.mocker.replace("logging.info")
1135
logging_mock("Queuing message with changes in known package locks:"
1136
" 1 created, 0 deleted.")
1137
self.mocker.replay()
1139
def got_result(result):
1140
self.assertMessages(message_store.get_pending_messages(),
1141
[{"type": "package-locks",
1142
"created": [("name", "", "")]}])
1143
self.assertEquals(self.store.get_package_locks(),
1146
result = self.reporter.detect_package_locks_changes()
1147
return result.addCallback(got_result)
1149
def test_detect_package_locks_changes_with_already_known_locks(self):
1151
We don't report changes about locks we already know about.
1153
message_store = self.broker_service.message_store
1154
message_store.set_accepted_types(["package-locks"])
1156
self.facade.set_package_lock("name1")
1157
self.facade.set_package_lock("name2", "<", "1.2")
1159
self.store.add_package_locks([("name1", "", "")])
1161
logging_mock = self.mocker.replace("logging.info")
1162
logging_mock("Queuing message with changes in known package locks:"
1163
" 1 created, 0 deleted.")
1164
self.mocker.replay()
1166
def got_result(result):
1167
self.assertMessages(message_store.get_pending_messages(),
1168
[{"type": "package-locks",
1169
"created": [("name2", "<", "1.2")]}])
1170
self.assertEquals(sorted(self.store.get_package_locks()),
1172
("name2", "<", "1.2")])
1174
result = self.reporter.detect_package_locks_changes()
1175
return result.addCallback(got_result)
1177
def test_detect_package_locks_changes_with_deleted_locks(self):
1179
If Smart indicates newly unset package locks, report them to the
1182
message_store = self.broker_service.message_store
1183
message_store.set_accepted_types(["package-locks"])
1185
self.store.add_package_locks([("name1", "", "")])
1187
logging_mock = self.mocker.replace("logging.info")
1188
logging_mock("Queuing message with changes in known package locks:"
1189
" 0 created, 1 deleted.")
1190
self.mocker.replay()
1192
def got_result(result):
1193
self.assertMessages(message_store.get_pending_messages(),
1194
[{"type": "package-locks",
1195
"deleted": [("name1", "", "")]}])
1196
self.assertEquals(self.store.get_package_locks(), [])
1198
result = self.reporter.detect_package_locks_changes()
971
1199
return result.addCallback(got_result)
973
1201
def test_run(self):