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)))
Example #2
0
 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()
Example #3
0
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"