parent
27be5546ea
commit
99adaa2002
141
api/repo_api.py
141
api/repo_api.py
|
@ -147,6 +147,67 @@ def search_process(process, string_to_search):
|
||||||
# ---------------------------------------------------------
|
# ---------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
def check_remote_connection(remote_ip, remote_user):
|
||||||
|
""" Comprueba la conexión SSH/SFTP con el servidor remoto que recibe como primer parámetro.
|
||||||
|
Se utiliza para chequear la conexión antes de importar o exportar una imagen.
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
# Iniciamos un cliente SSH:
|
||||||
|
ssh_client = paramiko.SSHClient()
|
||||||
|
# Establecemos la política por defecto para localizar la llave del host localmente:
|
||||||
|
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
|
||||||
|
|
||||||
|
# Conectamos con el equipo remoto por SSH:
|
||||||
|
ssh_client.connect(remote_ip, 22, remote_user) # Así se hace con claves
|
||||||
|
#ssh_client.connect(remote_ip, 22, remote_user, 'opengnsys') # Así se haría con password
|
||||||
|
|
||||||
|
# Iniciamos un cliente SFTP:
|
||||||
|
sftp_client = ssh_client.open_sftp()
|
||||||
|
|
||||||
|
# Retornamos "True", porque hemos conseguido conectar:
|
||||||
|
return True
|
||||||
|
|
||||||
|
# Si se produce una excepción, retornamos "False":
|
||||||
|
except Exception:
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
# ---------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
def check_remote_image(remote_ip, remote_user, image_file_path):
|
||||||
|
""" Conecta con el servidor remoto que recibe como primer parámetro,
|
||||||
|
para comprobar si la imagen que recibe como tercer parámetro existe, o si está bloqueada.
|
||||||
|
Se utiliza para chequear la imagen antes de importarla.
|
||||||
|
"""
|
||||||
|
# Iniciamos un cliente SSH:
|
||||||
|
ssh_client = paramiko.SSHClient()
|
||||||
|
# Establecemos la política por defecto para localizar la llave del host localmente:
|
||||||
|
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
|
||||||
|
|
||||||
|
# Conectamos con el equipo remoto por SSH:
|
||||||
|
ssh_client.connect(remote_ip, 22, remote_user) # Así se hace con claves
|
||||||
|
#ssh_client.connect(remote_ip, 22, remote_user, 'opengnsys') # Así se haría con password
|
||||||
|
|
||||||
|
# Iniciamos un cliente SFTP:
|
||||||
|
sftp_client = ssh_client.open_sftp()
|
||||||
|
|
||||||
|
# Si la imagen no existe, retornamos el mensaje correspondiente:
|
||||||
|
if not os.path.exists(image_file_path):
|
||||||
|
return "Remote image not found"
|
||||||
|
|
||||||
|
# Si la imagen existe pero está bloqueada, retornamos el mensaje correspondiente:
|
||||||
|
if os.path.exists(f"{image_file_path}.lock"):
|
||||||
|
return "Remote image is locked"
|
||||||
|
|
||||||
|
# Cerramos el cliente SSH y el cliente SFTP:
|
||||||
|
ssh_client.close()
|
||||||
|
sftp_client.close()
|
||||||
|
|
||||||
|
|
||||||
|
# ---------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
def check_lock_local(image_file_path, job_id):
|
def check_lock_local(image_file_path, job_id):
|
||||||
""" Cada minuto comprueba si existe un archivo ".lock" asociado a la imagen que recibe como parámetro
|
""" Cada minuto comprueba si existe un archivo ".lock" asociado a la imagen que recibe como parámetro
|
||||||
(lo que significará que hay una tarea en curso), en el repositorio local.
|
(lo que significará que hay una tarea en curso), en el repositorio local.
|
||||||
|
@ -634,9 +695,30 @@ def import_image():
|
||||||
remote_ip = json_data.get("repo_ip")
|
remote_ip = json_data.get("repo_ip")
|
||||||
remote_user = json_data.get("user")
|
remote_user = json_data.get("user")
|
||||||
|
|
||||||
|
# Comprobamos la conexión con el equipo remoto, y si falla salimos del endpoint, retornando un error:
|
||||||
|
connection_OK = check_remote_connection(remote_ip, remote_user)
|
||||||
|
if connection_OK == False:
|
||||||
|
return jsonify({
|
||||||
|
"success": False,
|
||||||
|
"exception": "Can't connect to remote server"
|
||||||
|
}), 400
|
||||||
|
|
||||||
# Construimos la ruta de la imagen:
|
# Construimos la ruta de la imagen:
|
||||||
image_file_path = f"{repo_path}{image_name}"
|
image_file_path = f"{repo_path}{image_name}"
|
||||||
|
|
||||||
|
# Comprobamos si la imagen remota no existe o está bloqueada, en cuyos casos salimos del endpoint y retornamos el error correspondiente:
|
||||||
|
check_image = check_remote_image(remote_ip, remote_user, image_file_path)
|
||||||
|
if check_image == "Remote image not found":
|
||||||
|
return jsonify({
|
||||||
|
"success": False,
|
||||||
|
"exception": "Remote image not found"
|
||||||
|
}), 400
|
||||||
|
elif check_image == "Remote image is locked":
|
||||||
|
return jsonify({
|
||||||
|
"success": False,
|
||||||
|
"exception": "Remote image is locked"
|
||||||
|
}), 400
|
||||||
|
|
||||||
# Construimos la llamada al script:
|
# Construimos la llamada al script:
|
||||||
cmd = ['sudo', 'python3', f"{script_path}/importImage.py", image_file_path, remote_ip, remote_user]
|
cmd = ['sudo', 'python3', f"{script_path}/importImage.py", image_file_path, remote_ip, remote_user]
|
||||||
|
|
||||||
|
@ -666,30 +748,14 @@ def import_image():
|
||||||
}), 500
|
}), 500
|
||||||
except subprocess.CalledProcessError as error:
|
except subprocess.CalledProcessError as error:
|
||||||
return jsonify({
|
return jsonify({
|
||||||
"success": False,
|
"success": False,
|
||||||
"process exception": str(error)
|
"process exception": str(error)
|
||||||
}), 500
|
}), 500
|
||||||
except Exception as error_description:
|
except Exception as error_description:
|
||||||
if "exit status 2" in str(error_description):
|
return jsonify({
|
||||||
return jsonify({
|
"success": False,
|
||||||
"success": False,
|
"exception": str(error_description)
|
||||||
"exception": "Can't connect to remote server"
|
}), 500
|
||||||
}), 400
|
|
||||||
elif "exit status 3" in str(error_description):
|
|
||||||
return jsonify({
|
|
||||||
"success": False,
|
|
||||||
"exception": "Remote image not found"
|
|
||||||
}), 400
|
|
||||||
elif "exit status 4" in str(error_description):
|
|
||||||
return jsonify({
|
|
||||||
"success": False,
|
|
||||||
"exception": "Remote image is locked"
|
|
||||||
}), 400
|
|
||||||
else:
|
|
||||||
return jsonify({
|
|
||||||
"success": False,
|
|
||||||
"exception": str(error_description)
|
|
||||||
}), 500
|
|
||||||
|
|
||||||
|
|
||||||
# ---------------------------------------------------------
|
# ---------------------------------------------------------
|
||||||
|
@ -711,15 +777,30 @@ def export_image():
|
||||||
# Obtenemos el nombre y la extensión de la imagen (y el subdirectorio de OU, si fuera el caso):
|
# Obtenemos el nombre y la extensión de la imagen (y el subdirectorio de OU, si fuera el caso):
|
||||||
param_dict = get_image_params(image_id, "repo")
|
param_dict = get_image_params(image_id, "repo")
|
||||||
|
|
||||||
# Evaluamos los parámetros obtenidos, para construir la ruta de la imagen, o para devover un error si no se ha encontrado la imagen:
|
# Evaluamos los parámetros obtenidos, para construir la ruta de la imagen, o para devover un error si no se ha encontrado la imagen (o si está bloqueada):
|
||||||
if param_dict:
|
if param_dict:
|
||||||
image_file_path = f"{param_dict['name']}.{param_dict['extension']}"
|
image_file_path = f"{param_dict['name']}.{param_dict['extension']}"
|
||||||
|
# Si la imagen existe pero está bloqueada, devolvemos un error:
|
||||||
|
if os.path.exists(f"{repo_path}{image_file_path}.lock"):
|
||||||
|
return jsonify({
|
||||||
|
"success": False,
|
||||||
|
"exception": "Image is locked"
|
||||||
|
}), 400
|
||||||
else:
|
else:
|
||||||
return jsonify({
|
return jsonify({
|
||||||
"success": False,
|
"success": False,
|
||||||
"error": "Image not found"
|
"error": "Image not found"
|
||||||
}), 400
|
}), 400
|
||||||
|
|
||||||
|
# Comprobamos la conexión con el equipo remoto, y si falla salimos del endpoint, retornando un error:
|
||||||
|
connection_OK = check_remote_connection(remote_ip, remote_user)
|
||||||
|
|
||||||
|
if connection_OK == False:
|
||||||
|
return jsonify({
|
||||||
|
"success": False,
|
||||||
|
"exception": "Can't connect to remote server"
|
||||||
|
}), 400
|
||||||
|
|
||||||
# Construimos la llamada al script:
|
# Construimos la llamada al script:
|
||||||
cmd = ['sudo', 'python3', f"{script_path}/exportImage.py", image_file_path, remote_ip, remote_user]
|
cmd = ['sudo', 'python3', f"{script_path}/exportImage.py", image_file_path, remote_ip, remote_user]
|
||||||
|
|
||||||
|
@ -753,17 +834,7 @@ def export_image():
|
||||||
"process exception": str(error)
|
"process exception": str(error)
|
||||||
}), 500
|
}), 500
|
||||||
except Exception as error_description:
|
except Exception as error_description:
|
||||||
if "exit status 3" in str(error_description):
|
if "exit status 5" in str(error_description):
|
||||||
return jsonify({
|
|
||||||
"success": False,
|
|
||||||
"exception": "Image is locked"
|
|
||||||
}), 400
|
|
||||||
elif "exit status 4" in str(error_description):
|
|
||||||
return jsonify({
|
|
||||||
"success": False,
|
|
||||||
"exception": "Can't connect to remote server"
|
|
||||||
}), 400
|
|
||||||
elif "exit status 5" in str(error_description):
|
|
||||||
return jsonify({
|
return jsonify({
|
||||||
"success": False,
|
"success": False,
|
||||||
"exception": "Image already exists on remote server"
|
"exception": "Image already exists on remote server"
|
||||||
|
|
Loading…
Reference in New Issue