diff --git a/.drone.yml b/.drone.yml index 5cbb14a..9f8f59e 100644 --- a/.drone.yml +++ b/.drone.yml @@ -30,6 +30,32 @@ steps: - docker push "$DOCKER_USERNAME/consumer_api" - docker push "$DOCKER_USERNAME/consumer_api:$DRONE_BUILD_NUMBER" +- name: make_docs + image: python:3.8 + commands: + - pip3 install Sphinx sphinx_rtd_theme + - pip3 install -r requirements.txt + - cd docs + - make html + +- name: build_docs + image: docker:stable-dind + volumes: + - name: dockersock + path: /var/run + environment: + DOCKER_USERNAME: + from_secret: DOCKER_USERNAME + DOCKER_PASSWORD: + from_secret: DOCKER_PASSWORD + commands: + - cd docs + - echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin + - docker build -t="$DOCKER_USERNAME/consumer-api-docs" . + - docker build -t="$DOCKER_USERNAME/consumer-api-docs:$DRONE_BUILD_NUMBER" . + - docker push "$DOCKER_USERNAME/consumer-api-docs" + - docker push "$DOCKER_USERNAME/consumer-api-docs:$DRONE_BUILD_NUMBER" + - name: slack image: plugins/slack settings: diff --git a/README.rst b/README.rst new file mode 100644 index 0000000..dc233b7 --- /dev/null +++ b/README.rst @@ -0,0 +1,12 @@ +================ +P2P Consumer API +================ + +Repository for the consumer's API + +implemented interfaces / functionalities: + +* consumer +* log +* sync + diff --git a/consumer_api/views/consumers_view.py b/consumer_api/views/consumers_view.py index 0582bc4..8c03a07 100644 --- a/consumer_api/views/consumers_view.py +++ b/consumer_api/views/consumers_view.py @@ -8,6 +8,8 @@ from flask_classful import FlaskView class ConsumersView(FlaskView): def get(self): + # load the currently available consumer list from the redis database consumer_list = json.loads((redis_client.get("consumer_list") or b"{}").decode('utf-8')) - current_app.logger.warning(jsonify([v['ip'] for k, v in consumer_list.items()])) + + # jsonify and return the list of active consumers return jsonify([v['ip'] for k, v in consumer_list.items()]) diff --git a/consumer_api/views/log_view.py b/consumer_api/views/log_view.py index abfff93..470b16b 100644 --- a/consumer_api/views/log_view.py +++ b/consumer_api/views/log_view.py @@ -5,5 +5,8 @@ from flask_classful import FlaskView class LogView(FlaskView): def post(self): + # display received message current_app.logger.info(f"New message: {request.json['message']}") + + # return HTTP 204 - No content message return Response(status = 204) diff --git a/consumer_api/views/sync_view.py b/consumer_api/views/sync_view.py index a6f8eb5..3c2f771 100644 --- a/consumer_api/views/sync_view.py +++ b/consumer_api/views/sync_view.py @@ -1,7 +1,7 @@ import json from flask import request, current_app, jsonify from flask_classful import FlaskView -from db import redis_client # ez nagyon otvar +from db import redis_client class SyncView(FlaskView): @@ -10,23 +10,25 @@ class SyncView(FlaskView): remote_uuid = request.json['uuid'] remote_ip = request.remote_addr + # load the currently available consumer list from the redis database consumer_list = json.loads((redis_client.get("consumer_list") or b"{}").decode('utf-8')) - # Log something about it if remote_uuid not in consumer_list.keys(): + # display newly registered consumer current_app.logger.info(f"New consumer registered (unknown UUID): {remote_uuid} at {remote_ip}") - else: # known + else: if consumer_list[remote_uuid]['ip'] != remote_ip: + # log address changes current_app.logger.info(f"Address of consumer {remote_uuid} changed to {remote_ip}") + # update consumer list redis databasse consumer_list.update( {remote_uuid: {"ip": remote_ip}} ) - redis_client.set("consumer_list", json.dumps(consumer_list).encode('utf-8')) + # return with the current UUID response = { "uuid": current_app.config['LOCAL_UUID'] } - return jsonify(response) diff --git a/docs/Dockerfile b/docs/Dockerfile new file mode 100644 index 0000000..691c92e --- /dev/null +++ b/docs/Dockerfile @@ -0,0 +1,3 @@ +FROM nginx:latest + +COPY _build/html/ /usr/share/nginx/html \ No newline at end of file diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..d4bb2cb --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = . +BUILDDIR = _build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/conf.py b/docs/conf.py new file mode 100644 index 0000000..5f67273 --- /dev/null +++ b/docs/conf.py @@ -0,0 +1,55 @@ +# Configuration file for the Sphinx documentation builder. +# +# This file only contains a selection of the most common options. For a full +# list see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Path setup -------------------------------------------------------------- + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +# import os +# import sys +# sys.path.insert(0, os.path.abspath('.')) + + +# -- Project information ----------------------------------------------------- + +project = 'Consumer API' +copyright = '2020, GoldenPogacsa Inc.' +author = 'GoldenPogacsa Inc.' + +# The full version, including alpha/beta/rc tags +release = '0.1.0' + + +# -- General configuration --------------------------------------------------- + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ +] + +# Add any paths that contain templates here, relative to this directory. +templates_path = [] + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] + + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = 'sphinx_rtd_theme' + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = [] \ No newline at end of file diff --git a/docs/index.rst b/docs/index.rst new file mode 100644 index 0000000..0769b9b --- /dev/null +++ b/docs/index.rst @@ -0,0 +1,23 @@ +.. Consumer API documentation master file, created by + sphinx-quickstart on Wed Apr 8 21:31:18 2020. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to Consumer API's documentation! +======================================== + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + readme + source/modules + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` +* `Git repository `_ diff --git a/docs/make.bat b/docs/make.bat new file mode 100644 index 0000000..2119f51 --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=. +set BUILDDIR=_build + +if "%1" == "" goto help + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/docs/readme.rst b/docs/readme.rst new file mode 100644 index 0000000..6b2b3ec --- /dev/null +++ b/docs/readme.rst @@ -0,0 +1 @@ +.. include:: ../README.rst \ No newline at end of file diff --git a/docs/source/app.rst b/docs/source/app.rst new file mode 100644 index 0000000..ceb7f40 --- /dev/null +++ b/docs/source/app.rst @@ -0,0 +1,7 @@ +app module +========== + +.. automodule:: app + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/source/db.rst b/docs/source/db.rst new file mode 100644 index 0000000..8d4f164 --- /dev/null +++ b/docs/source/db.rst @@ -0,0 +1,7 @@ +db module +========= + +.. automodule:: db + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/source/modules.rst b/docs/source/modules.rst new file mode 100644 index 0000000..026c014 --- /dev/null +++ b/docs/source/modules.rst @@ -0,0 +1,9 @@ +consumer_api +============ + +.. toctree:: + :maxdepth: 4 + + app + db + views diff --git a/docs/source/views.rst b/docs/source/views.rst new file mode 100644 index 0000000..2b282cb --- /dev/null +++ b/docs/source/views.rst @@ -0,0 +1,38 @@ +views package +============= + +Submodules +---------- + +views.consumers\_view module +---------------------------- + +.. automodule:: views.consumers_view + :members: + :undoc-members: + :show-inheritance: + +views.log\_view module +---------------------- + +.. automodule:: views.log_view + :members: + :undoc-members: + :show-inheritance: + +views.sync\_view module +----------------------- + +.. automodule:: views.sync_view + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: views + :members: + :undoc-members: + :show-inheritance: