Commit e4c37a1aecdea2e501a71e78a170b2254bc5110f

Authored by Alexis Koralewski
1 parent 46b415a3
Exists in dev

Upgrading mysql version and fixing sql queries

CHANGELOG
  1 +18-02-2022 (AKo): v0.3.7.0
  2 + - Upgrade Mysql version
  3 + - Fix sql queries for mysql 8.0
  4 + - Add pyros_user in sequence list and detail
  5 + - Add description field in observatories configuration
  6 + - Add those description as tooltips when they are displayed sequence fields
  7 + - Add local fontawesome css
  8 + - Rename configpyros properly (ConfigPyros)
  9 + - Fix dockerfile issue with permission (uid needs to be the same as the host)
  10 +
1 11 08-02-2022 (AKo) : v0.3.6.0
2 12 - Add DRF (Django Rest Framework) to requirements
3 13 - Add Pyros API (User and sequences with sequence submission)
... ...
Dockerfile
1 1 FROM python:3.8
  2 +ARG uid
2 3  
3 4 RUN apt-get update && apt-get install -y \
4 5 default-mysql-client \
... ... @@ -9,9 +10,9 @@ RUN apt-get update && apt-get install -y \
9 10 # Get IRAP self signed certificate
10 11 RUN echo | openssl s_client -connect gitlab.irap.omp.eu:443 -servername gitlab.irap.omp.eu 2>/dev/null | openssl x509 > /etc/ssl/certs/gitlab.irap.omp.eu.crt
11 12  
12   -
  13 +RUN echo "$uid" > test.txt
13 14 # adding new user (pyros_user) and creating his home folder
14   -RUN useradd --create-home --shell /bin/bash pyros_user
  15 +RUN useradd --create-home --shell /bin/bash pyros_user --uid $uid
15 16  
16 17 # Create the work dir and set permissions as pyros_user
17 18 RUN mkdir -p /home/pyros_user/app/ && chown -R pyros_user:pyros_user /home/pyros_user/app
... ...
VERSION
1   -0.3.6.0
2 1 \ No newline at end of file
  2 +0.3.7.0
3 3 \ No newline at end of file
... ...
docker/PYROS_DOCKER_BUILD.bat
1   -docker-compose build
  1 +CURRENT_UID=$(id -u) docker-compose build
2 2  
... ...
docker/PYROS_DOCKER_INSTALL
... ... @@ -15,6 +15,8 @@ fi
15 15 while ! docker inspect db_pyros --format='{{.State.Health.Status}}' | grep -q 'healthy'
16 16 do
17 17 sleep 5
  18 + heal_status=$(docker inspect db_pyros --format='{{.State.Health.Status}}')
  19 + echo "Current status : $heal_status"
18 20 done
19 21  
20 22 # db container is ready to execture queries, we can start the installation
... ...
docker/PYROS_DOCKER_START.bat
1 1 docker-compose down --remove-orphans
2 2  
3   -docker-compose up -d
  3 +CURRENT_UID=$(id -u) docker-compose up -d
4 4  
... ...
docker/docker-compose.yml
... ... @@ -3,7 +3,8 @@ version: "3.9"
3 3 services:
4 4 db:
5 5 # if we're using mysql >= 8, some of sql queries aren't valid anymore, like for creating and grant an user at the same time
6   - image: mysql:5.7.22
  6 + # This is fixed in pyros.py
  7 + image: mysql:8.0.28
7 8 command: --default-authentication-plugin=mysql_native_password
8 9 restart: always
9 10 container_name: db_pyros
... ... @@ -24,12 +25,6 @@ services:
24 25 # service image of python, that let users to interact with python scripts such as pyros.
25 26 pyros:
26 27 # path to the Dockerfile of this image
27   - build: ..
28   - container_name: pyros
29   - # tty is the -t option in docker exec
30   - tty: true
31   - # stdin_open is the -i option in docker exec
32   - stdin_open: true
33 28 env_file:
34 29 - variables.env
35 30 environment:
... ... @@ -42,6 +37,15 @@ services:
42 37 - "MYSQL_PYROS_LOGIN=${MYSQL_PYROS_LOGIN:-pyros}"
43 38 - "MYSQL_PYROS_PWD=${MYSQL_PYROS_PWD:-DjangoPyros}"
44 39 #- "IP_PYROS_USER=${IP_PYROS_USER:-172.28.1.5}"
  40 + build:
  41 + args:
  42 + uid: ${CURRENT_UID}
  43 + context: ..
  44 + container_name: pyros
  45 + # tty is the -t option in docker exec
  46 + tty: true
  47 + # stdin_open is the -i option in docker exec
  48 + stdin_open: true
45 49 volumes:
46 50 - ..:/home/pyros_user/app
47 51 # tells which port of local machine can communicate with the docker image (host:container), host is your local machine
... ...
pyros.py
... ... @@ -21,8 +21,6 @@ import sys
21 21 import time
22 22 import re
23 23 import glob
24   -from config.pyros.config_pyros import configpyros
25   -from git import Repo
26 24 #import logging
27 25  
28 26  
... ... @@ -345,9 +343,9 @@ def set_environment_variables_if_not_configured(env_path:str, env_sample_path:st
345 343 if WITH_DOCKER and os.environ.get(key) != value:
346 344 log.warning(f"WARNING: Environment value for '{key}' needs to be uptaded (To remove this message : restart docker container to update them).'")
347 345 else:
348   - if not WITH_DOCKER and os.environ.get(key) is None:
349   - log.error(f"ERROR: Error while reading value for '{key}'.Please fix the '{env_file}' file. For this run, PyROS will take the values from '{env_path}'")
350   - raise BaseException()
  346 + # if not WITH_DOCKER and os.environ.get(key) is None:
  347 + # log.error(f"ERROR: Error while reading value for '{key}'.Please fix the '{env_file}' file. For this run, PyROS will take the values from '{env_path}'")
  348 + # raise BaseException()
351 349 if WITH_DOCKER and os.environ.get(key) is None:
352 350 log.warning(f"WARNING: Environment value for '{key}' isn't defined within the container (To remove this message : restart docker container to update environment values). PyROS will take the values from '{env_path}'")
353 351 raise BaseException()
... ... @@ -519,6 +517,18 @@ def install_or_update(UPDATE:bool=False, packages_only:bool=False, database_only
519 517 print("- packages_only:", packages_only)
520 518 print("- database_only:", database_only)
521 519 # Git clone Guitastro if not already cloned:
  520 + try:
  521 + from git import Repo
  522 + except:
  523 + pip = "pip" if IS_WINDOWS else "pip3"
  524 + process = subprocess.Popen(pip + " install --upgrade GitPython", shell=True)
  525 + process.wait()
  526 + if process.returncode == 0:
  527 + # self.addExecuted(self.current_command, command)
  528 + from git import Repo
  529 + else:
  530 + log.error("GitPython package (required for obsconfig class) installation failed")
  531 +
522 532 if not os.path.exists( os.path.join(os.getcwd(),"./vendor/guitastro")):
523 533 print("Cloning Guiastro repository")
524 534 cloned_repo = Repo.clone_from("https://gitlab.irap.omp.eu/aklotz/guitastro.git", os.path.join(os.getcwd(),"./vendor/guitastro"))
... ... @@ -677,6 +687,19 @@ def initdb():
677 687 #def start(agent:str, configfile:str, test, verbosity):
678 688 def start(agent:str, configfile:str, observatory:str, unit:str):
679 689 log.debug("Running start command")
  690 + try:
  691 + from config.pyros.config_pyros import ConfigPyros
  692 + except:
  693 + #pip = "pip" if platform.system() == "Windows" else "pip3"
  694 + # TODO: "python -m pip" au lieu de "pip"
  695 + pip = "pip" if IS_WINDOWS else "pip3"
  696 + process = subprocess.Popen(pip + " install --upgrade pykwalify", shell=True)
  697 + process.wait()
  698 + if process.returncode == 0:
  699 + # self.addExecuted(self.current_command, command)
  700 + from config.pyros.config_pyros import configpyros
  701 + else:
  702 + log.error("pykwalify package (required for obsconfig class) installation failed")
680 703 if configfile:
681 704 log.debug("With config file"+ configfile)
682 705 os.environ["pyros_config_file"] = os.path.join(os.path.abspath(PYROS_DJANGO_BASE_DIR),"../../../config/pyros/", configfile)
... ... @@ -684,7 +707,7 @@ def start(agent:str, configfile:str, observatory:str, unit:str):
684 707 configfile = 'config_pyros.yml'
685 708 os.environ["pyros_config_file"] = os.path.join(os.path.abspath(PYROS_DJANGO_BASE_DIR),"../../../config/pyros/", configfile)
686 709  
687   - logo_name = configpyros(os.environ["pyros_config_file"]).pyros_config["general"]["logo"]
  710 + logo_name = ConfigPyros(os.environ["pyros_config_file"]).pyros_config["general"]["logo"]
688 711 logo_path = os.path.join(os.path.abspath(PYROS_DJANGO_BASE_DIR),"../../../config/pyros/", logo_name)
689 712 media_path = os.path.join(os.path.abspath(PYROS_DJANGO_BASE_DIR),"misc/static/media",logo_name)
690 713 shutil.copy(logo_path,media_path)
... ... @@ -1103,9 +1126,10 @@ def install_packages():
1103 1126 # Pip upgrade wheel and setuptools
1104 1127 venv_pip_install('wheel', '--upgrade')
1105 1128 #os.system(VENV_PIP+' install --upgrade wheel')
1106   - venv_pip_install('setuptools', '--upgrade')
1107   - #os.system(VENV_PIP+' install --upgrade setuptools')
1108   -
  1129 + # Not working with python 3.8 (on 17/02/2022)
  1130 + # venv_pip_install('setuptools', '--upgrade')
  1131 + os.system(VENV_PIP+' install setuptools==58')
  1132 +
1109 1133 # Pip install required packages from REQUIREMENTS file
1110 1134 print()
1111 1135 print(Colors.LOG_BLUE + "-----------------------------Installing python packages via pip-----------------------------" + Colors.END)
... ... @@ -1156,7 +1180,7 @@ def install_database(venv):
1156 1180 # --------------------------------------------
1157 1181 output = subprocess.check_output("mysql --version", shell=True)
1158 1182 # output is something like: "mysql Ver 15.1 Distrib 10.0.20-MariaDB, for Linux (x86_64) using EditLine wrapper"
1159   - tmp = (str(output).split()[4]).split('.')
  1183 + tmp = (str(output).split()[2]).split('.')
1160 1184 sql_version = float(tmp[0]+'.'+tmp[1])
1161 1185 print(Colors.LOG_BLUE + "MySQL version is " + str(sql_version) + Colors.END)
1162 1186  
... ... @@ -1184,7 +1208,8 @@ def install_database(venv):
1184 1208 IF_EXISTS = '' if sql_version < 5.5 else 'IF EXISTS'
1185 1209 sql_query = \
1186 1210 f"DROP DATABASE {IF_EXISTS} {SQL_DATABASE}; CREATE DATABASE {SQL_DATABASE}; " +\
1187   - f"DROP DATABASE {IF_EXISTS} {SQL_DATABASE_SIMU}; CREATE DATABASE {SQL_DATABASE_SIMU}; "
  1211 + f"DROP DATABASE {IF_EXISTS} {SQL_DATABASE_SIMU}; CREATE DATABASE {SQL_DATABASE_SIMU}; " +\
  1212 + f"DROP DATABASE {IF_EXISTS} {SQL_DATABASE_TEST}; CREATE DATABASE {SQL_DATABASE_TEST}; "
1188 1213  
1189 1214 # 2) Create user pyros and give it all rights on 3 databases
1190 1215 # Ne marche pas si l'utilisateur existe déjà => erreur
... ... @@ -1201,11 +1226,22 @@ def install_database(venv):
1201 1226 host = "%"
1202 1227 else:
1203 1228 host = "localhost"
1204   -
1205   - sql_query += f"GRANT ALL ON {SQL_DATABASE}.* TO '{SQL_USER}'@'{host}' IDENTIFIED BY '{SQL_PSWD}'; "
1206   - sql_query += f"GRANT ALL ON {SQL_DATABASE_SIMU}.* TO '{SQL_USER}'@'{host}' IDENTIFIED BY '{SQL_PSWD}'; "
1207   - # This database does not yet exists and will be automatically created by Django, but we already give access rights to it for pyros user
1208   - sql_query += f"GRANT ALL ON {SQL_DATABASE_TEST}.* TO '{SQL_USER}'@'{host}' IDENTIFIED BY '{SQL_PSWD}'; "
  1229 + # FOR MYSQL 8:
  1230 + if sql_version >=8:
  1231 + # We remove identified by because grant was creating the pyros user, wasn't working on version 8 so we separated the steps :
  1232 + # first we create the user then we grant him rights
  1233 + sql_query += f"CREATE USER IF NOT EXISTS '{SQL_USER}'@'{host}' IDENTIFIED BY '{SQL_PSWD}'; "
  1234 + sql_query += f"GRANT ALL ON {SQL_DATABASE}.* TO '{SQL_USER}'@'{host}'; "
  1235 + sql_query += f"GRANT ALL ON {SQL_DATABASE_SIMU}.* TO '{SQL_USER}'@'{host}'; "
  1236 + sql_query += f"GRANT ALL ON {SQL_DATABASE_TEST}.* TO '{SQL_USER}'@'{host}'; "
  1237 + else:
  1238 + sql_query += f"GRANT ALL ON {SQL_DATABASE}.* TO '{SQL_USER}'@'{host}' IDENTIFIED BY '{SQL_PSWD}'; "
  1239 + sql_query += f"GRANT ALL ON {SQL_DATABASE_SIMU}.* TO '{SQL_USER}'@'{host}' IDENTIFIED BY '{SQL_PSWD}'; "
  1240 + # This database does not yet exists and will be automatically created by Django, but we already give access rights to it for pyros user
  1241 + sql_query += f"GRANT ALL ON {SQL_DATABASE_TEST}.* TO '{SQL_USER}'@'{host}' IDENTIFIED BY '{SQL_PSWD}'; "
  1242 + # FOR MYSQL 8:
  1243 + if sql_version >= 8:
  1244 + sql_query += "FLUSH PRIVILEGES; "
1209 1245 #"GRANT USAGE ON *.* TO '"+SQL_USER+"'@localhost ; "
1210 1246  
1211 1247 '''
... ... @@ -1247,7 +1283,7 @@ def install_database(venv):
1247 1283 mysql_host = "localhost"
1248 1284  
1249 1285 # when using -p option, there is no space between the option and the password value
1250   - mysql_call_root = f'mysql -h {mysql_host} -u {mysql_login} -p{mysql_root_password}'
  1286 + mysql_call_root = f"mysql -h {mysql_host} -u '{mysql_login}' -p'{mysql_root_password}'"
1251 1287 mysql_call_pyros = "\"" + MYSQL_EXE_PATH+ "mysql\" -u "+SQL_USER+" -p"
1252 1288  
1253 1289 # --------------------------------------------
... ...