diff --git a/README.md b/README.md index d48fc6bfeb22d25ea8017530d34808719302a173..a58d15fb4cf0e1324ebeb9d272abb11361e7c1f7 100644 --- a/README.md +++ b/README.md @@ -4,18 +4,68 @@ To clone this repo use the command: ``` $ git clone https://gitlab.rc.uab.edu/mmoo97/flask_user_reg.git - ``` ## Prerequisites +### Clone Repository - Ensure `pip` is installed (see: https://packaging.python.org/guides/installing-using-pip-and-virtualenv/ ). + - Check if installed by typing `$ pip` for Mac/Linux or `$ py` for Windows. + - Mac/Linux: Install pip using `$ python -m pip install --user --upgrade pip`. + - Windows: Install pip using `$ py -m pip install --upgrade pip` - Ensure you have created a [virtual environment](https://packaging.python.org/guides/installing-using-pip-and-virtual-environments) called `venv` setup within the cloned project. - - Note, this project requires a virtual environment running python2 (2.7) + - Note, this project requires a virtual environment running python2 (2.7.x) - Ensure Flask and other dependencies are installed using the following commands: ``` $ cd ~/your/repo/path/flask_user_reg +$ git checkout version-1b-openstack-rabbitmq $ source venv/bin/activate $ pip install -r requirements.txt ``` - Note, to install flask in your own `$HOME` use `pip install --user Flask`. +### Install RabbitMQ +(Reference: [here](https://www.rabbitmq.com/tutorials/tutorial-four-python.html)) +- Install RabbitMQ server on the host machine. ([Installation Guide](https://www.rabbitmq.com/download.html)) + - #### Mac/Linux + - `$ brew update` + - `$ brew install rabbitmq` + - it is recommended that you add the following line to your `.bash_profile`: + `export PATH=$PATH:/usr/local/opt/rabbitmq/sbin`. + - Start server using the command `$ rabbitmq-server`. (Note, this implementation assumes RabbitMQ is running on localhost on standard port 5672) + - #### Windows + - Download the installer from [here](https://github.com/rabbitmq/rabbitmq-server/releases) and run. + - Post install, the server should be running. To check, run `$ rabbitmqctl.bat status`. + - #### CentOS 7 + - First, import signing key using `$ rpm --import https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc` + - Next, install Erlang using `$ yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm` + - Finally, install RabbitMq using `$ yum install rabbitmq-server-3.8.2-1.el8.noarch.rpm` + - The server is not started as a daemon by default when the RabbitMQ server package is installed. To start the + daemon by default when the system boots, as an administrator run: `$ chkconfig rabbitmq-server on`. + - As an administrator, start and stop the server as usual: <br/>`/sbin/service rabbitmq-server start` + <br/> `/sbin/service rabbitmq-server stop` + - Add the user "reggie" using the command `$ rabbitmqctl add_user reggie reggie`. + - The current configuration assumes the following username password combination. To change the password, type + `$ rabbitmqctl change_password reggie <new_password>`. + - Note that rabbitmqctl may require sudo permissions and that changing the password will require a password + change in the credentials within `test_producer.py` and `base_consumer.py` as well. + +## Test RabbitMQ +For a simple example on the functionality of RabbitMQ, do the following: +- Open up a new ssh terminal and ssh into your ohpc node and, in a separate window, ssh into your ood node. +- Once in, ensure your rabbitmq server is running using the command ` ` +- Additionally, ensure you have a rabbitmq user configured with the username and password as `reggie`. +- + +``` +# Run consumer on ohpc node +$ python base_consumer.py ohpc +``` + You will notice that the script is awaiting a message to display. + To produce a message, run the following on the ood node terminal session: + ``` +$ python test_producer.py ohpc +``` +You should now see that the message has been sent and displayed on the ohpc node. +- **Note,** that the `test_producer.py` script is identical to the code within the `ingest_data()` function in `run.py`. + + \ No newline at end of file diff --git a/base_consumer.py b/base_consumer.py new file mode 100644 index 0000000000000000000000000000000000000000..ebfe9dd0a65c9b4c9cdcf9b21cb1d15bf7dd2d9a --- /dev/null +++ b/base_consumer.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python +import pika # python client +import sys + +credentials = pika.PlainCredentials('reggie', 'reggie') +parameters = pika.ConnectionParameters('ood', + 5672, + '/', + credentials) +connection = pika.BlockingConnection(parameters) + +channel = connection.channel() + +channel.exchange_declare(exchange='direct_logs', exchange_type='direct') # create exchange to pass messages + +result = channel.queue_declare(queue='', exclusive=True) +queue_name = result.method.queue # creates a random name for the newly generated queue + +nodes = sys.argv[1:] +if not nodes: + sys.stderr.write("Usage: %s [ood] [ohpc] [manager]\n" % sys.argv[0]) + sys.exit(1) + +for node in nodes: + channel.queue_bind( + exchange='direct_logs', queue=queue_name, routing_key=node) # combine exchange, queue, and define routing name + +print(' [*] Waiting for logs. To exit press CTRL+C') + + +def callback(ch, method, properties, body): + print(" [x] %r:%r" % (method.routing_key, body)) + print('[%r] User creation task is done.' % method.routing_key) + + +channel.basic_consume( + queue=queue_name, on_message_callback=callback, auto_ack=True) # ingest messages, and assume delivered via auto_ack + +channel.start_consuming() # initiate message ingestion diff --git a/requirements.txt b/requirements.txt index 86d3ce5522b5e58199518a42873deefdfcadd732..ad23ea529894d6276ac79f5941bfff2f819b2a9a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -47,6 +47,7 @@ six==1.13.0 SQLAlchemy==1.3.11 SQLAlchemy-Utils==0.35.0 stevedore==1.31.0 +supervisor==4.1.0 urllib3==1.25.7 URLObject==2.4.3 virtualenv==16.7.7 diff --git a/run.py b/run.py index d671071aa9fab6b02e2d28b470658d10c836001c..ce01ce7d53504353f864649c0b565656465a72c9 100644 --- a/run.py +++ b/run.py @@ -51,20 +51,25 @@ def handle_my_custom_event(json, methods=['GET', 'POST']): def ingest_data(json, methods=['GET', 'POST']): print (time.strftime("%m-%d-%Y_%H:%M:%S") + '\tQueue request received: ' + str(json)) + # Begin RabbitMQ process. connection = pika.BlockingConnection( pika.ConnectionParameters(host='localhost')) channel = connection.channel() channel.exchange_declare(exchange='direct_logs', exchange_type='direct') - severity = sys.argv[1] if len(sys.argv) > 1 else 'info' - message = ' '.join(sys.argv[2:]) or 'Hello World!' + message = "Hey there" # todo: account info goes here + + channel.basic_publish( + exchange='direct_logs', routing_key="ohpc", body=message) + print(" [x] Sent %r:%r" % ("ohpc", message)) + channel.basic_publish( - exchange='direct_logs', routing_key=severity, body=message) - print(" [x] Sent %r:%r" % (severity, message)) + exchange='direct_logs', routing_key="ood", body=message) + print(" [x] Sent %r:%r" % ("ood", message)) connection.close() - # Todo: Make the remaining protion of this method in a RabbitMQ consumer + # Todo: Make the remaining portion of this method in a RabbitMQ consumer # try: # fullname = json["fullname"] diff --git a/test_producer.py b/test_producer.py new file mode 100644 index 0000000000000000000000000000000000000000..ce69cf63498e5dae3ee11404c433c20ad7553a59 --- /dev/null +++ b/test_producer.py @@ -0,0 +1,23 @@ +import pika +import sys + +# Begin RabbitMQ process. +credentials = pika.PlainCredentials('reggie', 'reggie') +parameters = pika.ConnectionParameters('ood', + 5672, + '/', + credentials) + +connection = pika.BlockingConnection(parameters) + +channel = connection.channel() + +channel.exchange_declare(exchange='direct_logs', exchange_type='direct') + +node = sys.argv[1] if len(sys.argv) > 1 else 'info' +message = ' '.join(sys.argv[2:]) or 'Hello World!' +channel.basic_publish( + exchange='direct_logs', routing_key=node, body=message) +print(" [x] Sent %r:%r" % (node, message)) + +connection.close()