|
12 | 12 | import socket
|
13 | 13 | import backoff
|
14 | 14 | import os
|
| 15 | +import sys |
15 | 16 |
|
16 | 17 | class PeerDiscoveryException(Exception):
|
17 | 18 | pass
|
@@ -72,12 +73,36 @@ def connect_the_dots(names):
|
72 | 73 | time.sleep(5)
|
73 | 74 | resp = requests.put(uri, data=json.dumps(doc))
|
74 | 75 | print('Adding cluster member', name, resp.status_code)
|
| 76 | + print('Cluster membership populated!') |
75 | 77 |
|
76 |
| -def sleep_forever(): |
| 78 | +def check_membership_forever(): |
| 79 | + creds = (os.getenv("COUCHDB_USER"), os.getenv("COUCHDB_PASSWORD")) |
| 80 | + expected_peers_count = os.getenv("COUCHDB_CLUSTER_SIZE") |
| 81 | + uri = "http://127.0.0.1:5984/_membership" |
| 82 | + print('Checking _membership data...') |
77 | 83 | while True:
|
78 |
| - time.sleep(5) |
| 84 | + if creds[0] and creds[1]: |
| 85 | + resp = requests.get(uri, auth=creds) |
| 86 | + else: |
| 87 | + resp = requests.get(uri) |
| 88 | + if resp.status_code != 200: |
| 89 | + print('ERROR: _membership responded with', resp.status_code, '!', file=sys.stderr) |
| 90 | + else: |
| 91 | + try: |
| 92 | + membership_json = json.loads(resp.text) |
| 93 | + if 'error' in membership_json: |
| 94 | + print('ERROR: _membership response contains error:', membership_json['error'], '!', file=sys.stderr) |
| 95 | + elif 'cluster_nodes' in membership_json and 'all_nodes' in membership_json: |
| 96 | + if membership_json['cluster_nodes'] != membership_json['all_nodes']: |
| 97 | + print('ERROR: cluster_nodes contains:', membership_json['cluster_nodes'], 'while all_nodes contains:', membership_json['all_nodes'], '!', file=sys.stderr) |
| 98 | + if expected_peers_count and len(membership_json['cluster_nodes']) < int(expected_peers_count): |
| 99 | + print('ERROR: cluster_nodes contains', len(membership_json['cluster_nodes']), 'nodes, but expecting', expected_peers_count, 'nodes!', file=sys.stderr) |
| 100 | + else: |
| 101 | + print('ERROR: _membership response does not contain expected data structure!', file=sys.stderr) |
| 102 | + except json.decoder.JSONDecodeError: |
| 103 | + print('ERROR: unable to decode JSON in _membership response!', file=sys.stderr) |
| 104 | + time.sleep(10) |
79 | 105 |
|
80 | 106 | if __name__ == '__main__':
|
81 | 107 | connect_the_dots(discover_peers(construct_service_record()))
|
82 |
| - print('Cluster membership populated!') |
83 |
| - sleep_forever() |
| 108 | + check_membership_forever() |
0 commit comments