def test_sync_builders_and_rings_if_changed(self, mock_cluster_sync_rings, mock_update_www_rings, mock_config, mock_is_elected_leader, mock_log, mock_balance_rings): _SWIFT_CONF_DIR = copy.deepcopy(swift_utils.SWIFT_CONF_DIR) _SWIFT_RINGS = copy.deepcopy(swift_utils.SWIFT_RINGS) @swift_utils.sync_builders_and_rings_if_changed def mock_balance(): for ring, builder in swift_utils.SWIFT_RINGS.items(): ring = os.path.join(swift_utils.SWIFT_CONF_DIR, '{}.ring.gz'.format(ring)) with open(ring, 'w') as fd: fd.write(str(uuid.uuid4())) with open(builder, 'w') as fd: fd.write(str(uuid.uuid4())) mock_balance_rings.side_effect = mock_balance tmp_ring_dir = tempfile.mkdtemp() init_ring_paths(tmp_ring_dir) try: swift_utils.balance_rings() finally: shutil.rmtree(tmp_ring_dir) self.assertTrue(mock_update_www_rings.called) self.assertTrue(mock_cluster_sync_rings.called) swift_utils.SWIFT_CONF_DIR = _SWIFT_CONF_DIR swift_utils.SWIFT_RINGS = _SWIFT_RINGS
def test_sync_builders_and_rings_if_changed(self, mock_cluster_sync_rings, mock_update_www_rings, mock_config, mock_is_elected_leader, mock_log, mock_balance_rings): @swift_utils.sync_builders_and_rings_if_changed def mock_balance(): for ring, builder in swift_utils.SWIFT_RINGS.items(): ring = os.path.join(swift_utils.SWIFT_CONF_DIR, '{}.ring.gz'.format(ring)) with open(ring, 'w') as fd: fd.write(str(uuid.uuid4())) with open(builder, 'w') as fd: fd.write(str(uuid.uuid4())) mock_balance_rings.side_effect = mock_balance init_ring_paths(tempfile.mkdtemp()) try: swift_utils.balance_rings() finally: shutil.rmtree(swift_utils.SWIFT_CONF_DIR) self.assertTrue(mock_update_www_rings.called) self.assertTrue(mock_cluster_sync_rings.called)
def remove_devices(args): """ Removes the device(s) from the ring(s). Removes the device(s) from the ring(s) based on the search pattern. :raises SwiftProxyCharmException: if pattern action_get('search-value') doesn't match any device in the ring. """ rings_valid = ['account', 'container', 'object', 'all'] rings_to_update = [] ring = action_get('ring') if ring not in rings_valid: action_fail("Invalid ring name '{}'. Should be one of: {}".format( ring, ', '.join(rings_valid))) return if ring == 'all': rings_to_update.extend(['account', 'container', 'object']) else: rings_to_update.append(ring) for ring_to_update in rings_to_update: ring_to_update_builder = ring_to_update + '.builder' ring_to_update_path = os.path.join(SWIFT_CONF_DIR, ring_to_update_builder) remove_from_ring(ring_to_update_path, action_get('search-value')) balance_rings()
def set_weight(args): """ Sets the device's weight. Sets the device's weight based on the search pattern. :raises SwiftProxyCharmException: if pattern action_get('search-value') doesn't match any device in the ring. """ if not is_elected_leader(SWIFT_HA_RES): action_fail('Must run action on leader unit') return rings_valid = ['account', 'container', 'object', 'all'] ring = action_get('ring') if ring not in rings_valid: action_fail('Invalid ring name.') return if ring == 'all': rings_to_update = ['account', 'container', 'object'] else: rings_to_update = [ring] for ring_to_update in rings_to_update: ring_to_update_builder = ring_to_update + '.builder' ring_to_update_path = os.path.join(SWIFT_CONF_DIR, ring_to_update_builder) set_weight_in_ring(ring_to_update_path, action_get('search-value'), str(action_get('weight'))) balance_rings()
def config_changed(): if is_elected_leader(SWIFT_HA_RES): log("Leader established, generating ring builders", level=INFO) # initialize new storage rings. for ring, path in SWIFT_RINGS.items(): if not os.path.exists(path): initialize_ring(path, config('partition-power'), determine_replicas(ring), config('min-hours')) if config('prefer-ipv6'): status_set('maintenance', 'Configuring ipv6') setup_ipv6() configure_https() open_port(config('bind-port')) update_nrpe_config() # Determine whether or not we should do an upgrade. if not config('action-managed-upgrade') and \ openstack.openstack_upgrade_available('swift'): do_openstack_upgrade(CONFIGS) status_set('maintenance', 'Running openstack upgrade') if not leader_get('swift-proxy-rings-consumer'): status_set('maintenance', 'Updating and (maybe) balancing rings') update_rings(min_part_hours=config('min-hours'), replicas=config('replicas')) if not config('disable-ring-balance') and is_elected_leader(SWIFT_HA_RES): # Try ring balance. If rings are balanced, no sync will occur. balance_rings() for r_id in relation_ids('identity-service'): keystone_joined(relid=r_id) for r_id in relation_ids('cluster'): cluster_joined(relation_id=r_id) for r_id in relation_ids('object-store'): object_store_joined(relation_id=r_id) for r_id in relation_ids('amqp'): amqp_joined(relation_id=r_id) for r_id in relation_ids('ha'): ha_relation_joined(relation_id=r_id) try_initialize_swauth() # call the policy overrides handler which will install any policy overrides policyd.maybe_do_policyd_overrides(openstack.os_release('swift-proxy'), 'swift')
def config_changed(): if is_elected_leader(SWIFT_HA_RES): log("Leader established, generating ring builders", level=INFO) # initialize new storage rings. for path in SWIFT_RINGS.itervalues(): if not os.path.exists(path): initialize_ring(path, config('partition-power'), config('replicas'), config('min-hours')) if config('prefer-ipv6'): status_set('maintenance', 'Configuring ipv6') setup_ipv6() configure_https() open_port(config('bind-port')) update_nrpe_config() # Determine whether or not we should do an upgrade. if not config('action-managed-upgrade') and \ openstack.openstack_upgrade_available('python-swift'): do_openstack_upgrade(CONFIGS) status_set('maintenance', 'Running openstack upgrade') status_set('maintenance', 'Updating and balancing rings') update_rings(min_part_hours=config('min-hours')) if not config('disable-ring-balance') and is_elected_leader(SWIFT_HA_RES): # Try ring balance. If rings are balanced, no sync will occur. balance_rings() for r_id in relation_ids('identity-service'): keystone_joined(relid=r_id) for r_id in relation_ids('object-store'): object_store_joined(relation_id=r_id)