~jseutter/landscape-client/invalid-integer

« back to all changes in this revision

Viewing changes to landscape/package/changer.py

  • Committer: Bjorn Tillenius
  • Date: 2012-01-20 13:04:12 UTC
  • mfrom: (432.1.17 add-remove-dpkg-holds)
  • Revision ID: bjorn@canonical.com-20120120130412-x3sci3vwaxnykzfn
Merged add-remove-dpkg-holds [r=tealeg,ack] [f=914742].

Add a message for adding and removing package holds, handling the
message in the package changer.

Show diffs side-by-side

added added

removed removed

Lines of Context:
18
18
from landscape.package.taskhandler import (
19
19
    PackageTaskHandler, PackageTaskHandlerConfiguration, PackageTaskError,
20
20
    run_task_handler)
21
 
from landscape.manager.manager import SUCCEEDED
 
21
from landscape.manager.manager import FAILED, SUCCEEDED
22
22
 
23
23
 
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)
106
108
 
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)
298
300
 
 
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)
 
306
 
 
307
    def handle_change_package_holds(self, message):
 
308
        """Handle a C{change-package-holds} message.
 
309
 
 
310
        Create and delete package holds as requested by the given C{message}.
 
311
        """
 
312
        if not self._facade.supports_package_holds:
 
313
            response = {
 
314
                "type": "operation-result",
 
315
                "operation-id": message.get("operation-id"),
 
316
                "status": FAILED,
 
317
                "result-text": "This client doesn't support package holds.",
 
318
                "result-code": 1}
 
319
            return self._send_change_package_holds_response(response)
 
320
 
 
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)
 
327
        if not_installed:
 
328
            response = {
 
329
                "type": "operation-result",
 
330
                "operation-id": message.get("operation-id"),
 
331
                "status": FAILED,
 
332
                "result-text": "Package holds not added, since the following" +
 
333
                               " packages are not installed: %s" % (
 
334
                                   ", ".join(sorted(not_installed))),
 
335
                "result-code": 1}
 
336
            return self._send_change_package_holds_response(response)
 
337
 
 
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()
 
344
 
 
345
        response = {"type": "operation-result",
 
346
                    "operation-id": message.get("operation-id"),
 
347
                    "status": SUCCEEDED,
 
348
                    "result-text": "Package holds successfully changed.",
 
349
                    "result-code": 0}
 
350
 
 
351
        return self._send_change_package_holds_response(response)
 
352
 
299
353
    @staticmethod
300
354
    def find_command():
301
355
        return find_changer_command()