예제 #1
0
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)
예제 #2
0
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)
예제 #3
0
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)
예제 #4
0
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],
    })
예제 #5
0
    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))
예제 #6
0
    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))
예제 #7
0
@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
예제 #8
0
    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()
예제 #9
0
                          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]
예제 #10
0
        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]