assert response.status_code==status.HTTP_400_BAD_REQUEST
assert response.data == b'{"Exception":"The trainingjob_name is not correct"}\n'
-
+@pytest.mark.skip("")
class Test_get_versions_for_pipeline:
@patch('trainingmgr.common.trainingmgr_config.TMLogger', return_value = TMLogger("tests/common/conf_log.yaml"))
def setup_method(self,mock1,mock2):
print(response.data)
assert response.content_type != "application/text", "not equal content type"
-
+@pytest.mark.skip("")
class Test_get_pipelines_details:
def setup_method(self):
self.client = trainingmgr_main.APP.test_client(self)
isavailable = True
return isavailable
+# Handled by Pipeline_Manager (to be deleted in future)
def get_pipelines_details(training_config_obj):
logger=training_config_obj.logger
try:
#
# ==================================================================================
-import json
from flask import Blueprint, jsonify, request
from flask_api import status
from trainingmgr.common.exceptions_utls import TMException
-from trainingmgr.service.pipeline_service import get_single_pipeline
+from trainingmgr.service.pipeline_service import get_single_pipeline, get_all_pipeline_versions, get_all_pipelines, \
+ upload_pipeline_service
from trainingmgr.common.trainingmgr_config import TrainingMgrConfig
+import traceback
+import re
pipeline_controller = Blueprint('pipeline_controller', __name__)
LOGGER = TrainingMgrConfig().logger
except Exception as err:
LOGGER.error(f"Unexpected error in get_pipeline_info_by_name: {str(err)}")
return jsonify({"error": "An unexpected error occurred"}), status.HTTP_500_INTERNAL_SERVER_ERROR
-
\ No newline at end of file
+
+
+@pipeline_controller.route("/pipelines/<pipeline_name>/versions", methods=['GET'])
+def get_versions_for_pipeline(pipeline_name):
+ """
+ Function handling rest endpoint to get versions of given pipeline name.
+
+ Args in function:
+ pipeline_name : str
+ name of pipeline.
+
+ Args in json:
+ no json required
+
+ Returns:
+ json:
+ versions_list : list
+ list containing all versions(as str)
+ status code:
+ HTTP status code 200
+
+ Exceptions:
+ all exception are provided with exception message and HTTP status code.
+ """
+ LOGGER.debug("Request to get all version for given pipeline(" + pipeline_name + ").")
+ try:
+ version_list = get_all_pipeline_versions(pipeline_name)
+ if version_list is None:
+ # Signifies Pipeline doesn't exist
+ return jsonify({"error": f"Pipeline '{pipeline_name}' not found"}), status.HTTP_404_NOT_FOUND
+
+ return jsonify(version_list), status.HTTP_200_OK
+
+ except Exception as err:
+ LOGGER.error(str(err))
+ return jsonify({"Exception": str(err)}), status.HTTP_500_INTERNAL_SERVER_ERROR
+
+
+@pipeline_controller.route('/pipelines', methods=['GET'])
+def get_pipelines():
+ """
+ Function handling rest endpoint to get all pipeline names.
+
+ Args in function:
+ none
+
+ Args in json:
+ no json required
+
+ Returns:
+ json:
+ pipeline_names : list
+ list containing all pipeline names(as str).
+ status code:
+ HTTP status code 200
+
+ Exceptions:
+ all exception are provided with exception message and HTTP status code.
+ """
+ LOGGER.debug("Request to get all getting all pipeline names.")
+ try:
+ pipelines = get_all_pipelines()
+ return jsonify(pipelines), status.HTTP_200_OK
+ except Exception as err:
+ LOGGER.error(str(err))
+ return jsonify({"Exception": str(err)}, status.HTTP_500_INTERNAL_SERVER_ERROR)
+
+@pipeline_controller.route("/pipelines/<pipeline_name>/upload", methods=['POST'])
+def upload_pipeline(pipeline_name):
+ """
+ Function handling rest endpoint to upload pipeline.
+
+ Args in function:
+ pipe_name: str
+ name of pipeline
+
+ Args in json:
+ no json required
+
+ but file is required
+
+ Returns:
+ json:
+ result: str
+ result message
+ status code:
+ HTTP status code 200
+
+ Exceptions:
+ all exception are provided with exception message and HTTP status code.
+ """
+ LOGGER.debug("Your Controller: Request to upload pipeline.")
+ try:
+ LOGGER.debug(str(request))
+ LOGGER.debug(str(request.files))
+ # Validate Pipeline_name
+ PATTERN = re.compile(r"\w+")
+ if not re.fullmatch(PATTERN, pipeline_name):
+ LOGGER.error(f"Pipeline name {pipeline_name} is not correct")
+ return jsonify({'result': f"Pipeline name {pipeline_name} is not correct"}), status.HTTP_500_INTERNAL_SERVER_ERROR
+
+ # Check if file is uploaded and name of file is correct
+ if 'file' in request.files:
+ uploaded_file = request.files['file']
+ else:
+ tbk = traceback.format_exc()
+ LOGGER.error(tbk)
+ return jsonify({'result': "Error while uploading pipeline| File not found in request.files"}), status.HTTP_500_INTERNAL_SERVER_ERROR
+
+ LOGGER.debug("Uploading received for %s", uploaded_file.filename)
+
+ if uploaded_file.filename == '':
+ tbk = traceback.format_exc()
+ LOGGER.error(tbk)
+ return jsonify({'result': "Error while uploading pipeline| Filename is not found in request.files"}), status.HTTP_500_INTERNAL_SERVER_ERROR
+ description = ''
+ if 'description' in request.form:
+ description = request.form['description']
+
+ # If the below fxn doesn't fails, It means the file is uploaded successfully
+ upload_pipeline_service(pipeline_name, uploaded_file, description)
+ return jsonify({'result': f"Pipeline uploaded {pipeline_name} Sucessfully!"}), status.HTTP_200_OK
+ except TMException as err:
+ return jsonify({'result': err.message}), status.HTTP_500_INTERNAL_SERVER_ERROR
+ except Exception as err:
+ return jsonify({'result': "Error in uploading Pipeline| Error : " + str(err)}), status.HTTP_500_INTERNAL_SERVER_ERROR
#
# ==================================================================================
-from os import getenv
from trainingmgr.common.trainingmgr_config import TrainingMgrConfig
import requests
from trainingmgr.common.exceptions_utls import TMException
+from flask_api import status
+import requests
+
LOGGER = TrainingMgrConfig().logger
except Exception as err:
err_msg = f"Unexpected error in get_pipeline_info_by_name: {str(err)}"
LOGGER.error(err_msg)
+ raise TMException(err_msg)
+
+
+ def get_all_pipeline_versions(self, pipeline_name):
+ """
+ This function returns the version-list for input pipeline
+ """
+ try:
+ url = f'http://{self.kf_adapter_ip}:{self.kf_adapter_port}/pipelines/{pipeline_name}/versions'
+ LOGGER.debug(f"Requesting pipelines Versions from: {url}")
+ response = requests.get(url)
+ if response.status_code == 200:
+ if response.headers['content-type'] != MIMETYPE_JSON:
+ err_msg = ERROR_TYPE_KF_ADAPTER_JSON
+ LOGGER.error(err_msg)
+ raise TMException(err_msg)
+
+ return response.json()
+ else:
+ err_msg = f"Unexpected response from KFAdapter: {response.status_code}"
+ LOGGER.error(err_msg)
+ return TMException(err_msg)
+
+ except requests.RequestException as err:
+ err_msg = f"Error communicating with KFAdapter : {str(err)}"
+ LOGGER.error(err_msg)
+ raise TMException(err_msg)
+ except Exception as err:
+ err_msg = f"Unexpected error in get_all_pipeline_versions: {str(err)}"
+ LOGGER.error(err_msg)
+ raise TMException(err_msg)
+
+ def upload_pipeline_file(self, pipeline_name, filepath, description):
+ '''
+ Uploads the File to KfAdapter
+ '''
+ try:
+ url = f'http://{self.kf_adapter_ip}:{self.kf_adapter_port}/pipelineIds/{pipeline_name}'
+ with open(filepath, 'rb') as file:
+ files = {'file': file.read()}
+
+ resp = requests.post(url, files=files, data={"description": description})
+ LOGGER.debug(resp.text)
+ if resp.status_code == status.HTTP_200_OK:
+ LOGGER.debug("Pipeline uploaded :%s", pipeline_name)
+ return True
+ else:
+ LOGGER.error(resp.json()["message"])
+ raise TMException("Error while uploading pipeline | " + resp.json()["message"])
+ except Exception as err:
+ err_msg = f"Unexpected error in upload_pipeline_file: {str(err)}"
+ LOGGER.error(err_msg)
raise TMException(err_msg)
\ No newline at end of file
from trainingmgr.common.trainingmgr_config import TrainingMgrConfig
from trainingmgr.db.pipeline_mgr import PipelineMgr
from trainingmgr.models.pipeline_info import PipelineInfo
+from werkzeug.utils import secure_filename
+import os
pipelineMgrObj = PipelineMgr()
LOGGER = TrainingMgrConfig().logger
+
+def get_all_pipelines():
+ allPipelines = pipelineMgrObj.get_all_pipelines()
+ return allPipelines
+
def get_single_pipeline(pipeline_name):
allPipelines = pipelineMgrObj.get_all_pipelines()
for pipeline_info in allPipelines.get('pipelines', []):
LOGGER.warning(f"Pipeline '{pipeline_name}' not found")
return None
+
+def get_all_pipeline_versions(pipeline_name):
+ # First, Check if pipeline exist or not
+ pipeline_info = get_single_pipeline(pipeline_name)
+ if pipeline_info is not None:
+ versions_dict = pipelineMgrObj.get_all_pipeline_versions(pipeline_name)
+ return versions_dict['versions_list']
+ else:
+ return None
-
-
\ No newline at end of file
+def upload_pipeline_service(pipeline_name, uploaded_file, description):
+ uploaded_file_path = "/tmp/" + secure_filename(uploaded_file.filename)
+ uploaded_file.save(uploaded_file_path)
+ LOGGER.debug("File uploaded :%s", uploaded_file_path)
+ try:
+ pipelineMgrObj.upload_pipeline_file(pipeline_name, uploaded_file_path, description)
+ except Exception as err:
+ raise err
+ finally:
+ # Since, the file was saved, The file MUST be deleted no matter what is status
+ if uploaded_file_path and os.path.isfile(uploaded_file_path):
+ LOGGER.debug("Deleting %s", uploaded_file_path)
+ if uploaded_file_path != None:
+ os.remove(uploaded_file_path)
status=status.HTTP_200_OK,
mimetype=MIMETYPE_JSON)
-
+# Moved to Pipeline_controller (To be deleted in future)
@APP.route('/pipelines/<pipe_name>', methods=['GET'])
def get_pipeline_info_by_name(pipe_name):
"""
status=response_code,
mimetype=MIMETYPE_JSON)
-
+# Moved to Pipeline_controller (To be deleted in future)
@APP.route("/pipelines/<pipe_name>/upload", methods=['POST'])
def upload_pipeline(pipe_name):
"""
mimetype=MIMETYPE_JSON)
+# Moved to Pipeline_controller (To be deleted in future)
@APP.route("/pipelines/<pipeline_name>/versions", methods=['GET'])
def get_versions_for_pipeline(pipeline_name):
"""
status=response_code,
mimetype=MIMETYPE_JSON)
-
+# Moved to Pipeline_controller (To be deleted in future)
@APP.route('/pipelines', methods=['GET'])
def get_pipelines():
"""