~tribaal/+junk/landscape-client-14.12-0ubuntu0.10.04

« back to all changes in this revision

Viewing changes to landscape/manager/packagemanager.py

  • Committer: Chris Glass
  • Date: 2014-12-15 06:54:28 UTC
  • Revision ID: chris.glass@canonical.com-20141215065428-e23g6yyvrsvyb656
Imported pristine tarball.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
import logging
 
2
import os
 
3
 
 
4
from twisted.internet.utils import getProcessOutput
 
5
from twisted.internet.defer import succeed
 
6
 
 
7
from landscape.package.store import PackageStore
 
8
from landscape.package.changer import PackageChanger
 
9
from landscape.package.releaseupgrader import ReleaseUpgrader
 
10
from landscape.manager.plugin import ManagerPlugin
 
11
 
 
12
 
 
13
class PackageManager(ManagerPlugin):
 
14
 
 
15
    run_interval = 1800
 
16
    _package_store = None
 
17
 
 
18
    def register(self, registry):
 
19
        super(PackageManager, self).register(registry)
 
20
        self.config = registry.config
 
21
 
 
22
        if not self._package_store:
 
23
            filename = os.path.join(registry.config.data_path,
 
24
                                    "package/database")
 
25
            self._package_store = PackageStore(filename)
 
26
 
 
27
        registry.register_message("change-packages",
 
28
                                  self.handle_change_packages)
 
29
        registry.register_message("change-package-locks",
 
30
                                  self.handle_change_package_locks)
 
31
        registry.register_message("release-upgrade",
 
32
                                  self.handle_release_upgrade)
 
33
 
 
34
        # When the package reporter notifies us that something has changed,
 
35
        # we want to run again to see if we can now fulfill tasks that were
 
36
        # skipped before.
 
37
        registry.reactor.call_on("package-data-changed", self.run)
 
38
 
 
39
        self.run()
 
40
 
 
41
    def _handle(self, cls, message):
 
42
        """Queue C{message} as a task, and spawn the proper handler."""
 
43
        self._package_store.add_task(cls.queue_name, message)
 
44
        self.spawn_handler(cls)
 
45
 
 
46
    def handle_change_packages(self, message):
 
47
        return self._handle(PackageChanger, message)
 
48
 
 
49
    def handle_change_package_locks(self, message):
 
50
        return self._handle(PackageChanger, message)
 
51
 
 
52
    def handle_release_upgrade(self, message):
 
53
        return self._handle(ReleaseUpgrader, message)
 
54
 
 
55
    def run(self):
 
56
        result = self.registry.broker.get_accepted_message_types()
 
57
        result.addCallback(self._got_message_types)
 
58
        return result
 
59
 
 
60
    def _got_message_types(self, message_types):
 
61
        if "change-packages-result" in message_types:
 
62
            self.spawn_handler(PackageChanger)
 
63
        if "operation-result" in message_types:
 
64
            self.spawn_handler(ReleaseUpgrader)
 
65
 
 
66
    def spawn_handler(self, cls):
 
67
        args = ["--quiet"]
 
68
        if self.config.config:
 
69
            args.extend(["-c", self.config.config])
 
70
        if self._package_store.get_next_task(cls.queue_name):
 
71
            # path is set to None so that getProcessOutput does not
 
72
            # chdir to "." see bug #211373
 
73
            result = getProcessOutput(cls.find_command(),
 
74
                                      args=args, env=os.environ,
 
75
                                      errortoo=1,
 
76
                                      path=None)
 
77
            result.addCallback(self._got_output, cls)
 
78
        else:
 
79
            result = succeed(None)
 
80
        return result
 
81
 
 
82
    def _got_output(self, output, cls):
 
83
        if output:
 
84
            logging.warning("Package %s output:\n%s" %
 
85
                            (cls.queue_name, output))