def process(self, cb): try: zk = self.zk except AttributeError: try: self.zk = zc.zk.ZK('zookeeper:2181') except zookeeper.ZooKeeperException: return self.error(cb, self.url, "Can't connect to ZooKeeper") zk = self.zk try: hosts = zk.get_properties('/hosts') except zookeeper.NoNodeException: return self.error(cb, self.url, "No node: /hosts") if 'version' not in hosts: return self.error(cb, self.url, "No version: /hosts") now = time.time() version = hosts['version'] if version != getattr(self, 'version', self): self.version = version self.version_time = now self.version_times = {} times = self.version_times late = [] for name in zk.get_children('/hosts'): properties = zk.get_properties('/hosts/'+name) if 'version' in properties: name = properties.get('name', name) if properties['version'] == version: if name in times: del times[name] if not times: self.version_time = now continue if name in times: dur = int(now - times[name]) / 60 else: times[name] = now dur = 0 late.append((dur, name)) if late: late.sort() dur, name = late[-1] mess = 'Unconverged (%s after %s minutes)' % (name, dur) if dur > 30: self.error(cb, self.url, mess) elif dur > 15: self.warn(cb, self.url, mess) else: self.ok(cb, self.url, mess) else: self.ok(cb, self.url, 'Converged (%s since %s)' % ( version, time.ctime(self.version_time)))
def get_addrs(a): to_send[0] = dict( (zc.parse_addr.parse_addr(addr), zk.get_properties( path+'/workers/providers/'+addr).get('version') ) for addr in addrs) awatcher.send()
def get_zk_version(zk): try: return zk.get_properties('/hosts')['version'] except kazoo.exceptions.NoNodeException: zk.import_tree('/hosts\n version="initial"') return "initial"