# Versión para openshift

## Instalación

Crear un proyecto.

### Running Commands as Root in OpenShift

    oc adm policy add-scc-to-user anyuid -z default
    
### app riesgos

A continuación añadir una app desde Agregar, importar desde git.

    oc new-app https://code.siemens.com/celestino.rey/riesgos.git -e DEBUG="False" -e VERSION=11.0 --name='riesgos'

Tal y como está la estructura de directorios, deberia detectar automáticamente una compilación Python

## asignación de los volúmenes
### Si la pvc no está creada

    oc set volume deployment.apps/riesgos --add -t pvc --claim-size=300M --name=riesgos-riesgos-migrations --claim-name='riesgos-riesgos-migrations' --claim-class='lvms-vg1' --mount-path='/app/riesgos/migrations'

    oc set volume deployment.apps/riesgos --add -t pvc --claim-size=300M --name=riesgos-media --claim-name='riesgos-media' --claim-class='lvms-vg1' --mount-path='/app/mediafiles'

    oc set volume deployment.apps/riesgos --add -t pvc --claim-size=300M --name=riesgos-gestion-migrations --claim-name='riesgos-gestion-migrations' --claim-class='lvms-vg1' --mount-path='/app/gestion/migrations'

    oc set volume deployment.apps/riesgos --add -t pvc --claim-size=300M --name=riesgos-usuarios-migrations --claim-name='riesgos-usuarios-migrations' --claim-class='lvms-vg1' --mount-path='/app/riesgos/migrations'

    oc set volume deployment.apps/riesgos --add -t pvc --claim-size=50G --name=static-volume --claim-name='static-volume' --claim-class='lvms-vg1' --mount-path='/app/staticfiles'
     
 
### Si la pvc ya está creada

    oc set volume deployment.apps/riesgos --add -t pvc --name=riesgos-riesgos-migrations --claim-name='riesgos-riesgos-migrations' --mount-path='/app/riesgos/migrations'

    oc set volume deployment.apps/riesgos --add -t pvc --name=riesgos-media --claim-name='riesgos-media' --mount-path='/app/mediafiles'

    oc set volume deployment.apps/riesgos --add -t pvc --name=riesgos-gestion-migrations --claim-name='riesgos-gestion-migrations' --mount-path='/app/gestion/migrations'

    oc set volume deployment.apps/riesgos --add -t pvc --name=riesgos-usuarios-migrations --claim-name='riesgos-usuarios-migrations' --mount-path='/app/usuarios/migrations'

    oc set volume deployment.apps/riesgos --add -t pvc --name=static-volume --claim-name='static-volume' --mount-path='/app/staticfiles'


## Exponer el servicio
    oc expose service/riesgos
    
### postgresql
Se hace desde el yaml

    oc create -f postgresql-deployment.yaml


python manage.py createsuperuser


python manage.py makemigrations

python manage.py migrate

## Comprobar la base de datos

Con la shell entraPsql.sh:

\l para listar las BD

\c riesgos para usar nuestra db
\dt para ver las tablas

# De dónde cogí ideas

https://learndjango.com/tutorials/django-login-and-logout-tutorial


Username: {{ user.username }}

User Full name: {{ user.get_full_name }}

User Group: {{ user.groups.all.0 }}

Email: {{ user.email }}

Session Started at: {{ user.last_login }}


## Para funcionar con gunicorn y nginx
https://testdriven.io/blog/dockerizing-django-with-postgres-gunicorn-and-nginx/



## Cambiar la secuencia de lo sid

ALTER SEQUENCE tablename_id_seq RESTART WITH nn;

esto se hace cuando restauro un volcado de la bd sobre una instalación nueva. Si hay índices ya creados, hay que reinciar a partir del último.

# code.siemens.com

## Estructura del proyecto

La estructura del proyecto es la siguiente:

    ├── K8S
    └── riesgos
        ├── accounts
        ├── gestion
        │   └── static
        ├── mediafiles
        │   └── profile_images
        ├── riesgos
        │   └── templatetags
        ├── templates
        │   ├── admin
        │   ├── gestion
        │   └── registration
        └── usuarios
            └── migrations


El nombre del proyecto es 'riesgos'.

El nombre de la app es 'gestion'.

La estructura esta diseñada para añadir mas apps, si fuese necesario.

Dentro del directorio del proyecto, 'riesgos', estan los directorios de:

    riesgos: comunes al proyecto
        urls.py:        las url del proyecto
        settings.py:    configuracion del proyecto
        templatetags:   tags personalizados para usar en las templates de html. Aqui esta un tag para obtener varialbes de entorno desde una template

    accounts: Tiene las url a las paginas de registro personalizadas

    gestion: contiene los ficheros de la app propiamente dichos:
        views.py:   el backend con la logica
        urls.py:    las url de la app
        models.py:  el modelo de la base de datos
        forms.py:   los formularios de entrada de datos

    templates:  los html del frontend de la app, organizado en directorios con el nombre de cada app

    usuarios:   modelo y formularios personalizados para la tabla de usuarios.

Ademas, hay una shell llamada 'entornoPruebas.sh' que establece ciertas variables cuando se lanza la app con runserver, sin kubernetes.

# Instalación


## el directorio K8S

### Contenido

Dentro del directorio se encuentra todo lo necesario para crear las imagenes y lanzar los deployments.

El Makefile principal tiene los siguientes comandos:

    imagen: Crea la imagen de la app. Lo hace invocando a otro Makefile que esta en el directorio principal.

            Las variables de entorno definidas al principio del fichero se usan para poner los tags a las imagenes.

    install: Crea los deployments, los volumenes, los claims y los servicios. Los deployment de la app y de nginx se invocan a traves de envsubst que lo que hace es sustituir las referencias a las variables definidas en el Makefile.

    clean:  Borra los deployment, los volumenes, los claims y los servicios.

    nginx:  Creaba la imagen de nginx. Al subirlo a code.siemens.com, no he encontrado la manera de generar una imagen con un nombre diferente al del proyecto, por lo que he tenido que crear un proyecto nuevo para nginx.

    backup: Crea un fichero sql con un backup de la base de datos.

Hay otro Makefile llamado Makefile.local que hace lo mismo pero usando el registry local, para probar. La variable de REGISTRY apunta a code.siemens.com o a localhost:5000

### Funcionamiento

Desde el directorio K8S ejecutar make (esto hace todo: la imagen, para los pods y los lanza otra vez)

La primera vez que se ejecuta la aplicacion, hay que entrar en el pod de riesgos con 'entra.sh' y

    python manage.py createsuperuser

    python manage.py makemigrations # si dice que no hay cambios, añadir las apps una a una (usuarios y gestion)

    python manage.py migrate

## Comprobar la base de datos

Con la shell entraPsql.sh:

    \l para listar las BD

    \c riesgos para usar nuestra db
    \dt para ver las tablas

# De dónde cogí ideas

## formularios de login y logout

https://learndjango.com/tutorials/django-login-and-logout-tutorial


## Para funcionar con gunicorn y nginx

https://testdriven.io/blog/dockerizing-django-with-postgres-gunicorn-and-nginx/


## Cambiar la secuencia de los id

    ALTER SEQUENCE tablename_id_seq RESTART WITH nn;

esto se hace cuando restauro un volcado de la bd sobre una instalación nueva. Si hay índices ya creados, hay que reinciar a partir del último.

# Funcionamiento con registries

    docker login <nombre-del-registry>

después de introducir las correspondientes credenciales

    cat $HOME/.docker/config.json |base64 

el resultado se copia y se pega en el fichero reg-secret.yaml, en el apartado .dockerconfigjson. Todo en una línea y quitando los espacios que surgan de componer todo en una línea.
