18
18
from landscape.package.taskhandler import (
19
19
PackageTaskHandler, PackageTaskHandlerConfiguration, PackageTaskError,
21
from landscape.manager.manager import SUCCEEDED
21
from landscape.manager.manager import FAILED, SUCCEEDED
24
24
class UnknownPackageData(Exception):
103
103
return result.addErrback(self.unknown_package_data_error, task)
104
104
if message["type"] == "change-package-locks":
105
105
return self.handle_change_package_locks(message)
106
if message["type"] == "change-package-holds":
107
return self.handle_change_package_holds(message)
107
109
def unknown_package_data_error(self, failure, task):
108
110
"""Handle L{UnknownPackageData} data errors.
296
298
"exchange urgently.")
297
299
return self._broker.send_message(response, True)
301
def _send_change_package_holds_response(self, response):
302
"""Log that a package holds result is sent and send the response."""
303
logging.info("Queuing message with change package holds results to "
304
"exchange urgently.")
305
return self._broker.send_message(response, True)
307
def handle_change_package_holds(self, message):
308
"""Handle a C{change-package-holds} message.
310
Create and delete package holds as requested by the given C{message}.
312
if not self._facade.supports_package_holds:
314
"type": "operation-result",
315
"operation-id": message.get("operation-id"),
317
"result-text": "This client doesn't support package holds.",
319
return self._send_change_package_holds_response(response)
321
not_installed = set()
322
holds_to_create = message.get("create", [])
323
for name in holds_to_create:
324
versions = self._facade.get_packages_by_name(name)
325
if not versions or not versions[0].package.installed:
326
not_installed.add(name)
329
"type": "operation-result",
330
"operation-id": message.get("operation-id"),
332
"result-text": "Package holds not added, since the following" +
333
" packages are not installed: %s" % (
334
", ".join(sorted(not_installed))),
336
return self._send_change_package_holds_response(response)
338
for hold in holds_to_create:
339
self._facade.set_package_hold(hold)
340
self._facade.reload_channels()
341
for hold in message.get("delete", []):
342
self._facade.remove_package_hold(hold)
343
self._facade.reload_channels()
345
response = {"type": "operation-result",
346
"operation-id": message.get("operation-id"),
348
"result-text": "Package holds successfully changed.",
351
return self._send_change_package_holds_response(response)
300
354
def find_command():
301
355
return find_changer_command()