Skip to content

Commit

Permalink
Merge pull request #53 from Full-Tortuga/release/v1.1.0
Browse files Browse the repository at this point in the history
Release/v1.1.0
  • Loading branch information
JSnow11 authored Dec 28, 2021
2 parents 7273bd0 + d2b13ef commit 87895bf
Show file tree
Hide file tree
Showing 131 changed files with 59,748 additions and 587 deletions.
38 changes: 38 additions & 0 deletions .github/workflows/django.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
name: Django CI

on:
push:
branches: [master, main, develop]
pull_request:
branches: [master, main, develop]

jobs:
build:
runs-on: ubuntu-latest
strategy:
max-parallel: 4
matrix:
python-version: [3.9]

services:
mongodb:
image: mongo:3.4.23
ports:
- 27017:27017

steps:
- uses: actions/checkout@v2
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v2
with:
python-version: ${{ matrix.python-version }}
- name: Install Dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
- name: Copy local_settings
run: |
cp ./decide/local_settings.example.py ./decide/local_settings.py
- name: Test administration module
run: |
python ./decide/manage.py test administration
34 changes: 34 additions & 0 deletions .github/workflows/react.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
name: React CI

on:
push:
branches: [master, main, develop]
pull_request:
branches: [master, main, develop]

jobs:
build:
runs-on: ubuntu-latest

strategy:
matrix:
node-version: [14.x]

steps:
- uses: actions/checkout@v2
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v1
with:
node-version: ${{ matrix.node-version }}
- name: Install dependencies
run: |
cd decide/administration/frontend &&
npm install
- name: Build app
run: |
cd decide/administration/frontend &&
npm run build --if-present
- name: Test app
run: |
cd decide/administration/frontend &&
npm run test
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ __pycache__/
# C extensions
*.so

# ide
.vscode

# Distribution / packaging
.Python
env/
Expand Down Expand Up @@ -101,3 +104,6 @@ ENV/
.mypy_cache/

.vagrant

# new db migrations
decide/*/migrations/0001_initial.py
146 changes: 85 additions & 61 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
[![Build Status](https://travis-ci.com/wadobo/decide.svg?branch=master)](https://travis-ci.com/wadobo/decide) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/94a85eaa0e974c71af6899ea3b0d27e0)](https://www.codacy.com/app/Wadobo/decide?utm_source=github.com&utm_medium=referral&utm_content=wadobo/decide&utm_campaign=Badge_Grade) [![Codacy Badge](https://api.codacy.com/project/badge/Coverage/94a85eaa0e974c71af6899ea3b0d27e0)](https://www.codacy.com/app/Wadobo/decide?utm_source=github.com&utm_medium=referral&utm_content=wadobo/decide&utm_campaign=Badge_Coverage)
[![Build Status](https://travis-ci.com/wadobo/decide.svg?branch=master)](https://travis-ci.com/wadobo/decide) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/94a85eaa0e974c71af6899ea3b0d27e0)](https://www.codacy.com/app/Wadobo/decide?utm_source=github.com&utm_medium=referral&utm_content=wadobo/decide&utm_campaign=Badge_Grade) [![Codacy Badge](https://api.codacy.com/project/badge/Coverage/94a85eaa0e974c71af6899ea3b0d27e0)](https://www.codacy.com/app/Wadobo/decide?utm_source=github.com&utm_medium=referral&utm_content=wadobo/decide&utm_campaign=Badge_Coverage)

Plataforma voto electrónico educativa
=====================================

El objetivo de este proyecto es implementar una plataforma de voto
electrónico seguro, que cumpla una serie de garantías básicas, como la
Expand All @@ -12,17 +11,14 @@ votación, por lo que prima la simplicidad por encima de la eficiencia
cuando sea posible. Por lo tanto se asumen algunas carencias para permitir
que sea entendible y extensible.


Subsistemas, apps y proyecto base
---------------------------------
## Subsistemas, apps y proyecto base

El proyecto se divide en [subsistemas](doc/subsistemas.md), los cuales estarán desacoplados
entre ellos. Para conseguir esto, los subsistemas se conectarán entre si mediante API y necesitamos un proyecto base donde configurar las ruts de estas API.

Este proyecto Django estará dividido en apps (subsistemas y proyecto base), donde cualquier app podrá ser reemplazada individualmente.

Gateway
-------
## Gateway

Para ofrecer un punto de entrada conocido para todos los subsistemas
existe el llamado **gateway** que no es más que una ruta disponible
Expand All @@ -49,52 +45,87 @@ gateway es útil para hacer uso desde peticiones de cliente, por ejemplo
en el javascript de la cabina de votación o la visualización de resultados,
y también para módulos externos que no sean aplicaciones django.

Configurar y ejecutar el proyecto
---------------------------------
## Configurar y ejecutar el proyecto

Para configurar el proyecto, podremos crearnos un fichero local_settings.py basado en el
local_settings.example.py, donde podremos configurar la ruta de nuestras apps o escoger que módulos
ejecutar.

Una vez hecho esto, será necesario instalar las dependencias del proyecto, las cuales están en el
Se hará uso de la base de datos MongoDB, para el correcto funcionamiento de la aplicación será necesaria la instalación de dicha base de datos siguiendo las instrucciones de la documentación oficial según el SO que estemos utilizando:

Windows: - https://docs.mongodb.com/manual/tutorial/install-mongodb-on-windows/

Ubuntu: - https://docs.mongodb.com/manual/tutorial/install-mongodb-on-ubuntu/

WSL: - https://docs.microsoft.com/es-es/windows/wsl/tutorials/wsl-database#install-mongodb

MacOs: - https://docs.mongodb.com/manual/tutorial/install-mongodb-on-os-x/

Una vez hecho esto, y corriendo la base de datos, será necesario instalar las dependencias del proyecto, las cuales están en el
fichero requirements.txt:

pip install -r requirements.txt

Tras esto tendremos que crearnos nuestra base de datos con postgres:
En caso de fallo al instalar las dependencias, es necesario instalas el paquete wheel y volver al comando anterior:
pip install wheel

Entramos en la carpeta del proyecto (cd decide) y realizamos las migraciones correspondientes para preparar la base de datos:

Además, será necesario instalar las dependencias correspondientes al panel de control desarrollado con
React. Para ello, primero se deberán tener instaldas las siguientes librerías de js con sus correspondientes
versiones: Node=14.15.0, npm=7.8.0.

sudo su - postgres
psql -c "create user decide with password 'decide'"
psql -c "create database decide owner decide"
A continuación, entramos en la carpeta del panel (cd decide_panel) y ejecutamos el siguiente comando:

Entramos en la carpeta del proyecto (cd decide) y realizamos la primera migración para preparar la
base de datos que utilizaremos:
npm install

./manage.py migrate
Situados en el directorio raíz del proyecto, entramos en la carpeta del proyecto (cd decide) y
realizamos la primera migración para preparar la base de datos que utilizaremos:

./manage.py makemigrations
./mange.py migrate

Por último, ya podremos ejecutar el módulos o módulos seleccionados en la configuración de la
siguiente manera:

./manage.py runserver

Ejecutar con docker
-------------------
También debemos lanzar el panel de control, para ello dentro de la carpeta decide_panel ejecutamos:

npm start

## Nuevo panel de administración

Para configurar el nuevo panel de control de administración se deben seguir los siguientes pasos. (se deben haber instalado los nuevos requirements y configurado la nueva base de datos tal y como se describe previamente)

Se recuerda que se debe copiar el archivo de configuración local de ejemplo:

- `cp local_settings.example.py local_settings.py`

### setup

- `cd /decide/administration/frontend`
- `npm install && npm run build`
- abrir `http://localhost:8000/administration` en el navegador
- hacer login con un superusuario

## Ejecutar con docker

Existe una configuración de docker compose que lanza 3 contenedores, uno
para el servidor de base de datos, otro para el django y otro con un
servidor web nginx para servir los ficheros estáticos y hacer de proxy al
servidor django:

* decide\_db
* decide\_web
* decide\_nginx
- decide_db
- decide_web
- decide_nginx

Además se crean dos volúmenes, uno para los ficheros estáticos y medias del
proyecto y otro para la base de datos postgresql, de esta forma los
contenedores se pueden destruir sin miedo a perder datos:

* decide\_db
* decide\_static
- decide_db
- decide_static

Se puede editar el fichero docker-settings.py para modificar el settings
del proyecto django antes de crear las imágenes del contenedor.
Expand Down Expand Up @@ -124,8 +155,7 @@ Lanzar una consola SQL:

$ docker exec -ti decide_db ash -c "su - postgres -c 'psql postgres'"

Ejecutar con vagrant + ansible
------------------------------
## Ejecutar con vagrant + ansible

Existe una configuración de vagrant que crea una máquina virtual con todo
lo necesario instalado y listo para funcionar. La configuración está en
Expand Down Expand Up @@ -160,8 +190,7 @@ Eliminar la máquina virtual:

$ vagrant destroy

Ansible
-------
## Ansible

El provisionamiento de la aplicación con vagrant está hecho con Ansible,
algo que nos permite utilizarlo de forma independiente para provisionar
Expand All @@ -178,13 +207,13 @@ Los scripts de ansible están divididos en varios ficheros .yml donde
se definen las diferentes tareas, por lo que es posible lanzar partes
independientes:

* packages.yml, dependencias del sistema
* user.yml, creación de usuario decide
* python.yml, git clone del repositorio e instalación de dependencias python en virtualenv
* files.yml, ficheros de configuración, systemd, nginx y local\_settings.py
* database.yml, creación de usuario y base de datos postgres
* django.yml, comandos django básicos y creación de usuario admin
* services.yml, reinicio de servicios, decide, nginx y postgres
- packages.yml, dependencias del sistema
- user.yml, creación de usuario decide
- python.yml, git clone del repositorio e instalación de dependencias python en virtualenv
- files.yml, ficheros de configuración, systemd, nginx y local_settings.py
- database.yml, creación de usuario y base de datos postgres
- django.yml, comandos django básicos y creación de usuario admin
- services.yml, reinicio de servicios, decide, nginx y postgres

Por ejemplo este comando sólo reinicia los servicios en el servidor:

Expand All @@ -194,8 +223,7 @@ El provisionamiento de ansible está diseñado para funcionar con **ubuntu/bioni
para funcionar con otras distribuciones es posible que haga falta modificar
el fichero packages.yml.

Versionado
----------
## Versionado

El versionado de API está hecho utilizando Django Rest Framework, y la forma
elegida para este versionado es mediante [parámetros de búsqueda](https://www.django-rest-framework.org/api-guide/versioning/#queryparameterversioning),
Expand All @@ -210,7 +238,6 @@ Si nosotros queremos que la salida que nos da la llamada a la API /voting/, sea
diferente en la versión 2, solo tenemos que comprobar en la versión nos está
llegando, y hacer lo que queramos, por ejemplo:


```
def get(self, request, *args, **kwargs):
version = request.version # Con request.version obtenemos la versión
Expand All @@ -224,12 +251,10 @@ llegando, y hacer lo que queramos, por ejemplo:

Para llamar a las diferentes versiones, haremos lo siguiente:

* /voting/?version=v1
* /voting/?version=v2
- /voting/?version=v1
- /voting/?version=v2


Test de estrés con Locust
-------------------------
## Test de estrés con Locust

Antes de empezar, comentaré para que sirven las pruebas de estrés. A veces necesitamos soportar que
nuestra aplicación ofrezca una cantidad de peticiones por segundo, porque habrá mucha gente entrando
Expand All @@ -246,7 +271,7 @@ Para ejecutar los test de estrés utilizando locust, necesitaremos tener instala
Una vez instalado, necesitaremos tener un fichero locustfile.py donde tengamos la configuración de
lo que vamos a ejecutar. En nuestro caso, tenemos hecho dos ejemplos:

1. Visualizer: entra en el visualizador de una votación para ver cuantas peticiones puede aguantar.
1. Visualizer: entra en el visualizador de una votación para ver cuantas peticiones puede aguantar.

Para ejecutar el test de Visualizer, tenemos que tener en cuenta que entra en la votación 1, por lo
que necesitaremos tenerla creada para que funcione correctamente, una vez hecho esto, podemos
Expand All @@ -259,34 +284,33 @@ lo que vamos a ejecutar. En nuestro caso, tenemos hecho dos ejemplos:
queremos que vaya creciendo hasta llegar a ese número. Por ejemplo, si ponemos 100 y 5, estaremos
creando 5 nuevos usuarios cada segundo hasta llegar a 100.

2. Voters: utilizaremos usuarios previamente creados, y haremos una secuencia de peticiones: login,
getuser y store. Sería lo que realizaría un usuario cuando va a votar, por lo que con este ejemplo
estaremos comprobando cuantas votaciones podemos hacer.

2. Voters: utilizaremos usuarios previamente creados, y haremos una secuencia de peticiones: login,
getuser y store. Sería lo que realizaría un usuario cuando va a votar, por lo que con este ejemplo
estaremos comprobando cuantas votaciones podemos hacer.

Para ejecutar el test de Voter, necesitaremos realizar varios preparos. Necesitaremos la votación 1
abierta, y necesitaremos crear una serie de usuarios en el censo de esta votación, para que cuando
hagamos el test, estos usuario puedan autenticarse y votar correctamente. Para facilitar esta
tarea, hemos creado el script de python gen_census.py, en el cual creamos los usuarios que
tenemos dentro del fichero voters.json y los añadimos al censo utilizando la librería requests.
Para que este script funcione, necesitaremos tener instalado request:
Para ejecutar el test de Voter, necesitaremos realizar varios preparos. Necesitaremos la votación 1
abierta, y necesitaremos crear una serie de usuarios en el censo de esta votación, para que cuando
hagamos el test, estos usuario puedan autenticarse y votar correctamente. Para facilitar esta
tarea, hemos creado el script de python gen_census.py, en el cual creamos los usuarios que
tenemos dentro del fichero voters.json y los añadimos al censo utilizando la librería requests.
Para que este script funcione, necesitaremos tener instalado request:

$ pip install requests
$ pip install requests

Una vez instalado, ejecutamos el script:
Una vez instalado, ejecutamos el script:

$ python gen_census.py
$ python gen_census.py

Tras esto, ya podremos comenzar el test de estrés de votantes:
Tras esto, ya podremos comenzar el test de estrés de votantes:

$ locust Voters
$ locust Voters

Importante mirar bien el fichero locustfile.py, donde existen algunas configuraciones que podremos
cambiar, dependiendo del HOST donde queramos hacer las pruebas y del id de la votación.

A tener en cuenta:

* En un servidor local, con un postgres que por defecto nos viene limitado a 100 usuarios
- En un servidor local, con un postgres que por defecto nos viene limitado a 100 usuarios
concurrentes, cuando pongamos más de 100, lo normal es que empiecen a fallar muchas peticiones.
* Si hacemos las pruebas en local, donde tenemos activado el modo debug de Django, lo normal es que
- Si hacemos las pruebas en local, donde tenemos activado el modo debug de Django, lo normal es que
las peticiones tarden algo más y consigamos menos RPS (Peticiones por segundo).
Empty file.
3 changes: 3 additions & 0 deletions decide/administration/admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from django.contrib import admin

# Register your models here.
5 changes: 5 additions & 0 deletions decide/administration/apps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
from django.apps import AppConfig


class AdministrationConfig(AppConfig):
name = 'administration'
26 changes: 26 additions & 0 deletions decide/administration/frontend/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.

# dependencies
/node_modules
/.pnp
.pnp.js

# testing
/coverage

# production
/build

# misc
.DS_Store
.env.local
.env.development.local
.env.test.local
.env.production.local

npm-debug.log*
yarn-debug.log*
yarn-error.log*

# css
tailwind.generated.css
Loading

0 comments on commit 87895bf

Please sign in to comment.