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]
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 }])