Beispiel #1
0
 def test_real_ttl(self):
     now = datetime.datetime.utcnow()
     member = Member(
         0, 'a', 'b', 'c',
         (now +
          datetime.timedelta(seconds=2)).strftime('%Y-%m-%dT%H:%M:%S.%fZ'),
         None)
     self.assertLess(member.real_ttl(), 2)
     self.assertEquals(Member(0, 'a', 'b', 'c', '', None).real_ttl(), -1)
Beispiel #2
0
    def _inner_load_cluster(self):
        self.cluster_event.clear()
        leader = self.get_node('/leader', self.cluster_watcher)
        self.members = self.load_members()
        if leader:
            if leader[0] == self._name:
                client_id = self.client.client_id
                if client_id is not None and client_id[0] != leader[
                        1].ephemeralOwner:
                    logger.info(
                        'I am leader but not owner of the session. Removing leader node'
                    )
                    self.client.delete(self.client_path('/leader'))
                    leader = None

            if leader:
                for member in self.members:
                    if member.name == leader[0]:
                        leader = member
                        self.fetch_cluster = False
                        break
            if not isinstance(leader, Member):
                leader = Member(-1, leader, None, None, None, None)
        self.leader = leader
        if self.fetch_cluster:
            last_leader_operation = self.get_node('/optime/leader')
            if last_leader_operation:
                self.last_leader_operation = int(last_leader_operation[0])
Beispiel #3
0
 def test_touch_member(self):
     self.p.ha.dcs.client.write = etcd_write
     self.p.touch_member()
     now = datetime.datetime.utcnow()
     member = Member(
         0, self.p.postgresql.name, 'b', 'c',
         (now + datetime.timedelta(seconds=self.p.shutdown_member_ttl +
                                   10)).strftime('%Y-%m-%dT%H:%M:%S.%fZ'),
         None)
     self.p.ha.cluster = Cluster(True, member, 0, [member])
     self.p.touch_member()
 def set_up(self):
     subprocess.call = subprocess_call
     shutil.copy = nop
     self.p = Postgresql({'name': 'test0', 'scope': 'batman', 'data_dir': 'data/test0',
                          'listen': '127.0.0.1, *:5432', 'connect_address': '127.0.0.2:5432',
                          'pg_hba': ['hostssl all all 0.0.0.0/0 md5', 'host all all 0.0.0.0/0 md5'],
                          'superuser': {'password': ''},
                          'admin': {'username': '******', 'password': '******'},
                          'replication': {'username': '******',
                                          'password': '******',
                                          'network': '127.0.0.1/32'},
                          'parameters': {'foo': 'bar'}, 'recovery_conf': {'foo': 'bar'},
                          'callbacks': {'on_start': 'true', 'on_stop': 'true',
                                        'on_restart': 'true', 'on_role_change': 'true',
                                        'on_reload': 'true'
                                        },
                          'restore': 'true'})
     psycopg2.connect = psycopg2_connect
     if not os.path.exists(self.p.data_dir):
         os.makedirs(self.p.data_dir)
     self.leader = Member(0, 'leader', 'postgres://*****:*****@127.0.0.1:5435/postgres', None, None, 28)
     self.other = Member(0, 'test1', 'postgres://*****:*****@127.0.0.1:5433/postgres', None, None, 28)
     self.me = Member(0, 'test0', 'postgres://*****:*****@127.0.0.1:5434/postgres', None, None, 28)
Beispiel #5
0
    def get_cluster(self):
        try:
            result = self.client.read(self.client_path(''), recursive=True)
            nodes = {
                os.path.relpath(node.key, result.key): node
                for node in result.leaves
            }

            # get initialize flag
            initialize = bool(nodes.get('initialize', False))

            # get last leader operation
            last_leader_operation = nodes.get('optime/leader', None)
            last_leader_operation = 0 if last_leader_operation is None else int(
                last_leader_operation.value)

            # get list of members
            members = [
                self.member(n) for k, n in nodes.items()
                if k.startswith('members/') and len(k.split('/')) == 2
            ]

            # get leader
            leader = nodes.get('leader', None)
            if leader:
                leader = Member(-1, leader.value, None, None, None, None)
                leader = ([m for m in members if m.name == leader.name]
                          or [leader])[0]

            return Cluster(initialize, leader, last_leader_operation, members)
        except etcd.EtcdKeyNotFound:
            return Cluster(False, None, None, [])
        except:
            logger.exception('get_cluster')

        raise EtcdError('Etcd is not responding properly')
Beispiel #6
0
 def member(node):
     conn_url, api_url = parse_connection_string(node.value)
     return Member(node.modifiedIndex, os.path.basename(node.key), conn_url,
                   api_url, node.expiration, node.ttl)
Beispiel #7
0
 def member(name, value, znode):
     conn_url, api_url = parse_connection_string(value)
     return Member(znode.mzxid, name, conn_url, api_url, None, None)
Beispiel #8
0
 def test_real_ttl(self):
     now = datetime.datetime.utcnow()
     member = Member(0, 'a', 'b', 'c', (now + datetime.timedelta(seconds=2)).strftime('%Y-%m-%dT%H:%M:%S.%fZ'), None)
     self.assertLess(member.real_ttl(), 2)
     self.assertEquals(Member(0, 'a', 'b', 'c', '', None).real_ttl(), -1)