import json import etcd3 as etcd3 from retrying import retry CLUSTER_INFO_KEY = '/syncthing_monitor/cluster_info' DEFAULT_PORT = 2379 class EtcdClient: def __init__(self, host, port=DEFAULT_PORT): self.etcd = etcd3.client(host=host, port=port) def load_cluster_info(self): raw_value, meta = self.etcd.get(CLUSTER_INFO_KEY) if raw_value is None: return {'devices': []} return json.loads(raw_value) @retry def append_device_id(self, device_id): with self.etcd.lock('syncthing_monitor'): cluster_info = self.load_cluster_info() if not any(device_id in element for element in cluster_info['devices']): cluster_info['devices'].append(device_id) print("Updating etcd value for '{0}': {1}".format(CLUSTER_INFO_KEY, json.dumps(cluster_info))) self.etcd.put(CLUSTER_INFO_KEY, json.dumps(cluster_info)) @retry def get_device_list(self): device_list = self.load_cluster_info()['devices'] print("Obtained device_list devices from etcd: {0}".format(json.dumps(device_list))) return device_list