~citrix-openstack/nova/xenapi

« back to all changes in this revision

Viewing changes to nova/service.py

  • Committer: Salvatore Orlando
  • Date: 2011-02-28 16:12:06 UTC
  • mfrom: (408.9.326 nova)
  • Revision ID: salvatore.orlando@eu.citrix.com-20110228161206-eo8z2knv7bpck1da
merge trunk

Show diffs side-by-side

added added

removed removed

Lines of Context:
45
45
flags.DEFINE_integer('report_interval', 10,
46
46
                     'seconds between nodes reporting state to datastore',
47
47
                     lower_bound=1)
48
 
 
49
48
flags.DEFINE_integer('periodic_interval', 60,
50
49
                     'seconds between running periodic tasks',
51
50
                     lower_bound=1)
52
51
 
53
 
flags.DEFINE_string('pidfile', None,
54
 
                    'pidfile to use for this service')
55
 
 
56
 
 
57
 
flags.DEFINE_flag(flags.HelpFlag())
58
 
flags.DEFINE_flag(flags.HelpshortFlag())
59
 
flags.DEFINE_flag(flags.HelpXMLFlag())
60
 
 
61
52
 
62
53
class Service(object):
63
54
    """Base class for workers that run on hosts."""
68
59
        self.binary = binary
69
60
        self.topic = topic
70
61
        self.manager_class_name = manager
 
62
        manager_class = utils.import_class(self.manager_class_name)
 
63
        self.manager = manager_class(host=self.host, *args, **kwargs)
71
64
        self.report_interval = report_interval
72
65
        self.periodic_interval = periodic_interval
73
66
        super(Service, self).__init__(*args, **kwargs)
75
68
        self.timers = []
76
69
 
77
70
    def start(self):
78
 
        manager_class = utils.import_class(self.manager_class_name)
79
 
        self.manager = manager_class(host=self.host, *self.saved_args,
80
 
                                                     **self.saved_kwargs)
 
71
        vcs_string = version.version_string_with_vcs()
 
72
        logging.audit(_("Starting %(topic)s node (version %(vcs_string)s)"),
 
73
                      {'topic': self.topic, 'vcs_string': vcs_string})
81
74
        self.manager.init_host()
82
75
        self.model_disconnected = False
83
76
        ctxt = context.get_admin_context()
157
150
            report_interval = FLAGS.report_interval
158
151
        if not periodic_interval:
159
152
            periodic_interval = FLAGS.periodic_interval
160
 
        vcs_string = version.version_string_with_vcs()
161
 
        logging.audit(_("Starting %(topic)s node (version %(vcs_string)s)")
162
 
                % locals())
163
153
        service_obj = cls(host, binary, topic, manager,
164
154
                          report_interval, periodic_interval)
165
155
 
181
171
                pass
182
172
        self.timers = []
183
173
 
 
174
    def wait(self):
 
175
        for x in self.timers:
 
176
            try:
 
177
                x.wait()
 
178
            except Exception:
 
179
                pass
 
180
 
184
181
    def periodic_tasks(self):
185
182
        """Tasks to be run at a periodic interval"""
186
183
        self.manager.periodic_tasks(context.get_admin_context())
214
211
 
215
212
 
216
213
def serve(*services):
217
 
    FLAGS(sys.argv)
218
 
    logging.basicConfig()
219
 
 
220
 
    if not services:
221
 
        services = [Service.create()]
 
214
    try:
 
215
        if not services:
 
216
            services = [Service.create()]
 
217
    except Exception:
 
218
        logging.exception('in Service.create()')
 
219
        raise
 
220
    finally:
 
221
        # After we've loaded up all our dynamic bits, check
 
222
        # whether we should print help
 
223
        flags.DEFINE_flag(flags.HelpFlag())
 
224
        flags.DEFINE_flag(flags.HelpshortFlag())
 
225
        flags.DEFINE_flag(flags.HelpXMLFlag())
 
226
        FLAGS.ParseNewFlags()
222
227
 
223
228
    name = '_'.join(x.binary for x in services)
224
229
    logging.debug(_("Serving %s"), name)