def check_rabbitmq_and_enable_ha_mode(client, logger): """ Verify RabbitMQ is running properly and enable HA mode :param client: Client on which to check RabbitMQ :type client: ovs.extensions.generic.sshclient.SSHClient :param logger: Logger object used for logging :type logger: ovs.log.log_handler.LogHandler :return: None """ if not ServiceManager.has_service('rabbitmq-server', client): raise RuntimeError('Service rabbitmq-server has not been added on node {0}'.format(client.ip)) rabbitmq_running, same_process = ServiceManager.is_rabbitmq_running(client=client) if rabbitmq_running is False or same_process is False: Toolbox.change_service_state(client, 'rabbitmq-server', 'restart', logger) time.sleep(5) client.run(['rabbitmqctl', 'set_policy', 'ha-all', '^(volumerouter|ovs_.*)$', '{"ha-mode":"all"}'])
def configure_rabbitmq(client, logger): """ Configure RabbitMQ :param client: Client on which to configure RabbitMQ :type client: ovs.extensions.generic.sshclient.SSHClient :param logger: Logger object used for logging :type logger: ovs.log.log_handler.LogHandler :return: None """ Toolbox.log(logger=logger, messages='Setting up RabbitMQ') rabbitmq_port = Configuration.get('/ovs/framework/messagequeue|endpoints')[0].split(':')[1] rabbitmq_login = Configuration.get('/ovs/framework/messagequeue|user') rabbitmq_password = Configuration.get('/ovs/framework/messagequeue|password') client.file_write('/etc/rabbitmq/rabbitmq.config', """[ {{rabbit, [{{tcp_listeners, [{0}]}}, {{default_user, <<"{1}">>}}, {{default_pass, <<"{2}">>}}, {{log_levels, [{{connection, warning}}]}}, {{vm_memory_high_watermark, 0.2}}]}} ].""".format(rabbitmq_port, rabbitmq_login, rabbitmq_password)) rabbitmq_running, same_process = ServiceManager.is_rabbitmq_running(client=client) if rabbitmq_running is True: # Example output of 'list_users' command # Listing users ... # guest [administrator] # ovs [] # ... done. users = [user.split('\t')[0] for user in client.run(['rabbitmqctl', 'list_users']).splitlines() if '\t' in user and '[' in user and ']' in user] if 'ovs' in users: Toolbox.log(logger=logger, messages='Already configured RabbitMQ') return Toolbox.change_service_state(client, 'rabbitmq-server', 'stop', logger) client.run(['rabbitmq-server', '-detached']) time.sleep(5) # Sometimes/At random the rabbitmq server takes longer than 5 seconds to start, # and the next command fails so the best solution is to retry several times # Also retry the add_user/set_permissions, and validate the result retry = 0 while retry < 10: users = Toolbox.retry_client_run(client=client, command=['rabbitmqctl', 'list_users'], logger=logger).splitlines() users = [usr.split('\t')[0] for usr in users if '\t' in usr and '[' in usr and ']' in usr] logger.debug('Rabbitmq users {0}'.format(users)) if 'ovs' in users: logger.debug('User ovs configured in rabbitmq') break logger.debug(Toolbox.retry_client_run(client=client, command=['rabbitmqctl', 'add_user', rabbitmq_login, rabbitmq_password], logger=logger)) logger.debug(Toolbox.retry_client_run(client=client, command=['rabbitmqctl', 'set_permissions', rabbitmq_login, '.*', '.*', '.*'], logger=logger)) retry += 1 time.sleep(1) client.run(['rabbitmqctl', 'stop']) time.sleep(5)