def replicate(request): n = nm.get_by_host_port( request.form['master_host'], int(request.form['master_port'])) if n is None or n.assignee_id is None: raise ValueError('unable to replicate') task = models.task.ClusterTask(cluster_id=n.assignee_id, task_type=models.task.TASK_TYPE_REPLICATE) task.add_step('replicate', cluster_id=n.assignee_id, master_host=n.host, master_port=n.port, slave_host=request.form['slave_host'], slave_port=int(request.form['slave_port'])) db.session.add(task)
def migrate_slots(request): src_host = request.form['src_host'] src_port = int(request.form['src_port']) dst_host = request.form['dst_host'] dst_port = int(request.form['dst_port']) slots = [int(s) for s in request.form['slots'].split(',')] src = nm.get_by_host_port(src_host, src_port) task = models.task.ClusterTask(cluster_id=src.assignee_id, task_type=models.task.TASK_TYPE_MIGRATE) task.add_step('migrate', src_host=src.host, src_port=src.port, dst_host=dst_host, dst_port=dst_port, slots=slots) db.session.add(task)
def quit_cluster(request): n = nm.get_by_host_port(request.post_json['host'], int(request.post_json['port'])) if n is None: raise ValueError('no such node') task = models.task.ClusterTask(cluster_id=n.assignee_id, task_type=models.task.TASK_TYPE_QUIT) for migr in request.post_json.get('migratings', []): task.add_step('migrate', src_host=n.host, src_port=n.port, dst_host=migr['host'], dst_port=migr['port'], slots=migr['slots']) task.add_step('quit', cluster_id=n.assignee_id, host=n.host, port=n.port) db.session.add(task)
def cluster_auto_discover(): host = request.args['host'] port = int(request.args['port']) try: nodes = redistrib.command.list_nodes(host, port, host)[0] except StandardError as e: logging.exception(e) raise ValueError(e) if len(nodes) <= 1 and len(nodes[0].assigned_slots) == 0: return json_response({'cluster_discovered': False}) return json_response({ 'cluster_discovered': True, 'nodes': [{ 'host': n.host, 'port': n.port, 'role': n.role_in_cluster, 'known': nm.get_by_host_port(n.host, n.port) is not None, } for n in nodes], })
def test_timed(self): CD = 5 class TestTimedClient(alarm.Timed): def __init__(self): alarm.Timed.__init__(self, CD) self.alarms = [] def do_send_alarm(self, endpoint, message, exception, **kwargs): self.alarms.append({ 'endpoint': endpoint, 'message': message, }) self.app.replace_alarm_client(TestTimedClient()) p = FakePoller(self.app) nm.create_instance('127.0.0.1', 29000) commit_session() self.app.write_polling_targets() p.poll_once() self.assertEqual(0, len(self.app.alarm_client.alarms)) n = nm.get_by_host_port('127.0.0.1', 29000) n.suppress_alert = False commit_session() self.app.write_polling_targets() p.poll_once() self.assertEqual(1, len(self.app.alarm_client.alarms)) p.poll_once() self.assertEqual(1, len(self.app.alarm_client.alarms)) time.sleep(CD + 1) p.poll_once() self.assertEqual(2, len(self.app.alarm_client.alarms))
def test_alarm(self): class TestAlarmClient(alarm.Base): def __init__(self): self.alarms = {} def send_alarm(self, endpoint, message, exception, **kwargs): self.alarms[(endpoint.host, endpoint.port)] = (message, exception) self.app.replace_alarm_client(TestAlarmClient()) p = FakePoller(self.app) nm.create_instance('127.0.0.1', 29000) commit_session() self.app.write_polling_targets() p.poll_once() self.assertEqual(0, len(self.app.alarm_client.alarms)) n = nm.get_by_host_port('127.0.0.1', 29000) n.suppress_alert = False commit_session() self.app.write_polling_targets() p.poll_once() self.assertEqual(1, len(self.app.alarm_client.alarms))
@bp.route_post_json('/autojoin') def cluster_auto_join(): host = request.form['host'] port = int(request.form['port']) try: nodes = redistrib.command.list_nodes(host, port, host)[0] except StandardError, e: logging.exception(e) raise ValueError(e) cluster_ids = set() free_nodes = [] for n in nodes: p = nm.get_by_host_port(n.host, n.port) if p is None: raise ValueError('no such node') if p.assignee_id is None: free_nodes.append(p) else: cluster_ids.add(p.assignee_id) if len(cluster_ids) > 1: raise ValueError('nodes are in different clusters according to db') cluster_id = (models.cluster.create_cluster('').id if len(cluster_ids) == 0 else cluster_ids.pop()) try: for p in free_nodes: p.assignee_id = cluster_id
try: nodes = redistrib.command.list_nodes(host, port, host)[0] except StandardError, e: logging.exception(e) raise ValueError(e) if len(nodes) <= 1 and len(nodes[0].assigned_slots) == 0: return base.json_result({'cluster_discovered': False}) return base.json_result({ 'cluster_discovered': True, 'nodes': [{ 'host': n.host, 'port': n.port, 'role': n.role_in_cluster, 'known': nm.get_by_host_port(n.host, n.port) is not None, } for n in nodes], }) @base.post_async('/cluster/autojoin') def cluster_auto_join(request): host = request.form['host'] port = int(request.form['port']) try: nodes = redistrib.command.list_nodes(host, port, host)[0] except StandardError, e: logging.exception(e) raise ValueError(e) cluster_ids = set()
redistrib.command.replicate) @base.get_async('/cluster/autodiscover') def cluster_auto_discover(request): host = request.args['host'] port = int(request.args['port']) try: nodes = redistrib.command.list_nodes(host, port, host)[0] except StandardError, e: logging.exception(e) raise ValueError(e) unknown_nodes = [] for n in nodes: if nm.get_by_host_port(n.host, n.port) is None: unknown_nodes.append(n) return base.json_result([{ 'host': n.host, 'port': n.port, 'role': n.role_in_cluster, } for n in unknown_nodes]) @base.post_async('/cluster/autojoin') def cluster_auto_join(request): host = request.form['host'] port = int(request.form['port']) try: nodes = redistrib.command.list_nodes(host, port, host)[0]