Exemple #1
0
    def test_reconcile_remove_device(self):
        # given a ring builder with two devices
        b = RingBuilder(10, 1, 1)
        r = RingController(b, "object")
        ds = ["r1z1-192.168.0.2:6000/d3", "r1z2-192.168.2.2:5000/d1"]
        r.reconcile(ds)

        # when device is removed
        ds = ["r1z2-192.168.2.2:5000/d1"]
        r.reconcile(ds)

        # then only one device is present
        devs = b.search_devs([])
        self.assertEqual(1, len(devs))
        self.assertEqual(devs, [{
            'device': 'd1',
            'id': 1,
            'ip': '192.168.2.2',
            'meta': '',
            'parts': 1024,
            'parts_wanted': 0,
            'port': 5000,
            'region': 1,
            'replication_ip': None,
            'replication_port': None,
            'weight': 1.0,
            'zone': 2
        }])
def write_ring(args, devices, builderfile):
    # Make an educated guess about the used port. These are the defaults for
    # TripleO-based deployments in Mitaka
    builder_fname = os.path.basename(builderfile)
    if 'account' in builder_fname:
        port = 6002
    elif 'container' in builder_fname:
        port = 6001
    elif 'object' in builder_fname:
        port = 6000
    else:
        port = 6000

    logging.debug('Set port for new devices to %d' % port)

    if not os.path.isfile(builderfile):
        logging.info(
            '%s not found, creating new builder file', builderfile)
        rb = RingBuilder(args.part_power, args.replicas, args.min_part_hours)
    else:
        logging.info('Using existing builder file %s', builderfile)
        rb = RingBuilder.load(builderfile)

    # Add all missing devices
    for dev in devices:
        _dev = rb.search_devs({'meta': dev['meta']})
        if not _dev:
            dev['weight'] = float(dev.get('size')) / 10**9
            dev['region'] = 1
            dev['zone'] = 1
            dev['port'] = port
            dev['replication_ip'] = dev['ip']
            dev['replication_port'] = dev['port']
            rb.add_dev(dev)
            logging.info('Added device %s / %s', dev['ip'], dev['device'])
        else:
            logging.info(
                'Ignoring existing device %s / %s', dev['ip'], dev['device'])
    try:
        rb.rebalance()
    except RingValidationError as exc:
        logging.error(exc)
    rb.save(builderfile)
    ring_file = os.path.splitext(builderfile)[0] + '.ring.gz'
    ring_data = rb.get_ring()
    ring_data.save(ring_file)
    return [builderfile, ring_file]
def write_ring(args, devices, builderfile):
    # Make an educated guess about the used port. These are the defaults for
    # TripleO-based deployments in Mitaka
    builder_fname = os.path.basename(builderfile)
    if 'account' in builder_fname:
        port = 6002
    elif 'container' in builder_fname:
        port = 6001
    elif 'object' in builder_fname:
        port = 6000
    else:
        port = 6000

    logging.debug('Set port for new devices to %d' % port)

    if not os.path.isfile(builderfile):
        logging.info('%s not found, creating new builder file', builderfile)
        rb = RingBuilder(args.part_power, args.replicas, args.min_part_hours)
    else:
        logging.info('Using existing builder file %s', builderfile)
        rb = RingBuilder.load(builderfile)

    # Add all missing devices
    for dev in devices:
        _dev = rb.search_devs({'meta': dev['meta']})
        if not _dev:
            dev['weight'] = float(dev.get('size')) / 10**9
            dev['region'] = 1
            dev['zone'] = 1
            dev['port'] = port
            dev['replication_ip'] = dev['ip']
            dev['replication_port'] = dev['port']
            rb.add_dev(dev)
            logging.info('Added device %s / %s', dev['ip'], dev['device'])
        else:
            logging.info('Ignoring existing device %s / %s', dev['ip'],
                         dev['device'])
    try:
        rb.rebalance()
    except RingValidationError as exc:
        logging.error(exc)
    rb.save(builderfile)
    ring_file = os.path.splitext(builderfile)[0] + '.ring.gz'
    ring_data = rb.get_ring()
    ring_data.save(ring_file)
    return [builderfile, ring_file]
Exemple #4
0
    def test_reconcile_add_devices(self):
        # given a empty ring builder
        b = RingBuilder(10, 1, 1)
        r = RingController(b, "object")

        # when new devices are added
        ds = ["r1z1-192.168.0.2:6000/d3", "r1z1-192.168.2.2:5000/d1"]
        r.reconcile(ds)

        # then new devices are present
        devs = b.search_devs([])
        self.assertEqual(2, len(devs))
        self.assertEqual(devs, [{
            'device': 'd3',
            'id': 0,
            'ip': '192.168.0.2',
            'meta': '',
            'parts': 512,
            'parts_wanted': 0,
            'port': 6000,
            'region': 1,
            'replication_ip': None,
            'replication_port': None,
            'weight': 1.0,
            'zone': 1
        }, {
            'device': 'd1',
            'id': 1,
            'ip': '192.168.2.2',
            'meta': '',
            'parts': 512,
            'parts_wanted': 0,
            'port': 5000,
            'region': 1,
            'replication_ip': None,
            'replication_port': None,
            'weight': 1.0,
            'zone': 1
        }])