def cluster_non_leader_actions(): """Cluster relation hook actions to be performed by non-leader units. NOTE: must be called by non-leader from cluster relation hook. """ log("Cluster changed by unit=%s (local is non-leader)" % (remote_unit()), level=DEBUG) settings = relation_get() or {} # Check whether we have been requested to stop proxy service rq_key = SwiftProxyClusterRPC.KEY_STOP_PROXY_SVC token = settings.get(rq_key, None) if token: log("Peer request to stop proxy service received (%s) - sending ack" % (token), level=INFO) service_stop('swift-proxy') peers_only = settings.get('peers-only', None) rq = SwiftProxyClusterRPC().stop_proxy_ack(echo_token=token, echo_peers_only=peers_only) relation_set(relation_settings=rq) return # Check if there are any builder files we can sync from the leader. log("Non-leader peer - checking if updated rings available", level=DEBUG) broker = settings.get('builder-broker', None) if not broker: log("No update available", level=DEBUG) if not is_paused(): service_start('swift-proxy') return builders_only = int(settings.get('sync-only-builders', 0)) path = os.path.basename(get_www_dir()) try: sync_proxy_rings('http://%s/%s' % (broker, path), rings=not builders_only) except CalledProcessError: log("Ring builder sync failed, builders not yet available - " "leader not ready?", level=WARNING) return None # Re-enable the proxy once all builders and rings are synced if fully_synced(): log("Ring builders synced - starting proxy", level=INFO) CONFIGS.write_all() if not is_paused(): service_start('swift-proxy') else: log("Not all builders and rings synced yet - waiting for peer sync " "before starting proxy", level=INFO)
def configure_https(): """Enables SSL API Apache config if appropriate and kicks identity-service with any required api updates. """ # need to write all to ensure changes to the entire request pipeline # propagate (c-api, haprxy, apache) CONFIGS.write_all() if 'https' in CONFIGS.complete_contexts(): cmd = ['a2ensite', 'openstack_https_frontend'] check_call(cmd) else: cmd = ['a2dissite', 'openstack_https_frontend'] check_call(cmd) # Apache 2.4 required enablement of configuration if os.path.exists('/usr/sbin/a2enconf'): check_call(['a2enconf', 'swift-rings']) if not is_paused(): # TODO: improve this by checking if local CN certs are available # first then checking reload status (see LP #1433114). service_reload('apache2', restart_on_failure=True) for rid in relation_ids('identity-service'): keystone_joined(relid=rid) env_vars = {'OPENSTACK_SERVICE_SWIFT': 'proxy-server', 'OPENSTACK_PORT_API': config('bind-port'), 'OPENSTACK_PORT_MEMCACHED': 11211} openstack.save_script_rc(**env_vars)
def storage_changed(): """Storage relation. Only the leader unit can update and distribute rings so if we are not the leader we ignore this event and wait for a resync request from the leader. """ if not is_elected_leader(SWIFT_HA_RES): log("Not the leader - ignoring storage relation until leader ready.", level=DEBUG) return log("Leader established, updating ring builders", level=INFO) host_ip = get_host_ip() if not host_ip: log("No host ip found in storage relation - deferring storage " "relation", level=WARNING) return update_rsync_acls() zone = get_zone(config('zone-assignment')) node_settings = { 'ip': host_ip, 'zone': zone, 'account_port': relation_get('account_port'), 'object_port': relation_get('object_port'), 'container_port': relation_get('container_port'), } if None in node_settings.itervalues(): missing = [k for k, v in node_settings.iteritems() if v is None] log("Relation not ready - some required values not provided by " "relation (missing=%s)" % (', '.join(missing)), level=INFO) return None for k in ['zone', 'account_port', 'object_port', 'container_port']: node_settings[k] = int(node_settings[k]) CONFIGS.write_all() # Allow for multiple devs per unit, passed along as a : separated list # Update and balance rings. nodes = [] devs = relation_get('device') if devs: for dev in devs.split(':'): node = {k: v for k, v in node_settings.items()} node['device'] = dev nodes.append(node) update_rings(nodes) if not is_paused(): # Restart proxy here in case no config changes made (so # pause_aware_restart_on_change() ineffective). service_restart('swift-proxy')