From 6389104dadaa37c3edaf88f4dfd523f4fe977190 Mon Sep 17 00:00:00 2001 From: subhash kumar singh Date: Wed, 13 Nov 2024 21:25:46 +0000 Subject: [PATCH] Implemented the Models and bluprint for POST POST operaiton on training job implmented which will populate the modelID automatically. Change-Id: I68d565ec36d92698c9a97b5277e90a39f40002e9 Signed-off-by: subhash kumar singh --- trainingmgr/controller/trainingjob_controller.py | 17 ++++++++++++++--- trainingmgr/db/trainingjob_db.py | 6 ++++++ trainingmgr/models/__init__.py | 2 +- trainingmgr/models/trainingjob.py | 18 +++++++++++------- trainingmgr/schemas/trainingjob_schema.py | 19 ++++++++++++++++++- trainingmgr/service/training_job_service.py | 7 ++++++- 6 files changed, 56 insertions(+), 13 deletions(-) diff --git a/trainingmgr/controller/trainingjob_controller.py b/trainingmgr/controller/trainingjob_controller.py index db18111..1369d4f 100644 --- a/trainingmgr/controller/trainingjob_controller.py +++ b/trainingmgr/controller/trainingjob_controller.py @@ -15,16 +15,15 @@ # limitations under the License. # # ================================================================================== -from flask import Blueprint, jsonify +from flask import Blueprint, jsonify, request from trainingmgr.common.trainingmgr_config import TrainingMgrConfig -from trainingmgr.service.training_job_service import delete_training_job +from trainingmgr.service.training_job_service import delete_training_job, create_training_job training_job_controller = Blueprint('training_job_controller', __name__) LOGGER = TrainingMgrConfig().logger @training_job_controller.route('/training-jobs/', methods=['DELETE']) def delete_trainingjob(training_job_id): - TrainingMgrConfig.logger LOGGER.debug(f'delete training job : {training_job_id}') try: if delete_training_job(str(training_job_id)): @@ -36,6 +35,18 @@ def delete_trainingjob(training_job_id): 'message': 'training job with given id is not found' }), 500 + except Exception as e: + return jsonify({ + 'message': str(e) + }), 500 + +@training_job_controller.route('/training-jobs', methods=['POST']) +def create_trainingjob(): + try: + data = request.get_json() + create_training_job(data) + LOGGER.debug(f'create training job Successfully: {data}') + return '', 200 except Exception as e: return jsonify({ 'message': str(e) diff --git a/trainingmgr/db/trainingjob_db.py b/trainingmgr/db/trainingjob_db.py index 94c8cd0..b57c652 100644 --- a/trainingmgr/db/trainingjob_db.py +++ b/trainingmgr/db/trainingjob_db.py @@ -288,6 +288,12 @@ def delete_trainingjob_version(trainingjob_name, version): raise DBException(DB_QUERY_EXEC_ERROR + \ "delete_trainingjob_version" + str(err)) +from trainingmgr.schemas import TrainingJobSchema +def create_trainingjob(data): + tj = TrainingJobSchema().load(data) + db.session.add(tj) + db.session.commit() + def delete_trainingjob_by_id(id: int): """ This function delets the trainingjob using the id which is PK diff --git a/trainingmgr/models/__init__.py b/trainingmgr/models/__init__.py index 984f025..fdb06a8 100644 --- a/trainingmgr/models/__init__.py +++ b/trainingmgr/models/__init__.py @@ -23,4 +23,4 @@ from trainingmgr.models.trainingjob import TrainingJob from trainingmgr.models.featuregroup import FeatureGroup from trainingmgr.models.steps_state import TrainingJobStatus -__all_ = ['TrainingJob', 'FeatureGroup', 'TrainingJobStatus'] \ No newline at end of file +__all__ = ['TrainingJob', 'FeatureGroup', 'TrainingJobStatus', 'ModelID'] \ No newline at end of file diff --git a/trainingmgr/models/trainingjob.py b/trainingmgr/models/trainingjob.py index 3452516..d12e6fe 100644 --- a/trainingmgr/models/trainingjob.py +++ b/trainingmgr/models/trainingjob.py @@ -20,12 +20,14 @@ from datetime import datetime from sqlalchemy.sql import func from sqlalchemy import Integer, ForeignKey, String, DateTime, Column, Boolean from sqlalchemy.orm import relationship -from sqlalchemy import PrimaryKeyConstraint, ForeignKeyConstraint, UniqueConstraint -import json + +from . import db +from sqlalchemy import ForeignKeyConstraint, UniqueConstraint + class ModelID(db.Model): __tablename__ = 'model' - id = db.Column(db.Integer, primary_key=True) + id = db.Column(db.Integer, primary_key=True, autoincrement=True) modelname = db.Column(db.String(128), nullable=False) modelversion = db.Column(db.String(128), nullable=False) artifactversion = db.Column(db.String(128), nullable=True) @@ -34,12 +36,12 @@ class ModelID(db.Model): UniqueConstraint("modelname", "modelversion", name="unique model"), ) - trainingJob = relationship("TrainingJob", back_populates='modelref') + trainingJob = relationship("TrainingJob", back_populates='modelId') class TrainingJob(db.Model): __tablename__ = "trainingjob_info_table" - id = Column(Integer, primary_key=True) + id = Column(Integer, primary_key=True, autoincrement=True, nullable=False) trainingjob_name= Column(String(128), nullable=False) run_id = Column(String(1000), nullable=True) steps_state_id = Column(Integer, ForeignKey('training_job_status_table.id'), nullable=True) @@ -65,7 +67,7 @@ class TrainingJob(db.Model): ) - modelref = relationship("ModelID", back_populates="trainingJob") + modelId = relationship("ModelID", back_populates="trainingJob") # # Serialize and Deserialize training_config to/from JSON # @property @@ -75,5 +77,7 @@ class TrainingJob(db.Model): # @training_config_data.setter # def training_config_data(self, value): # self.training_config = json.dumps(value) + def __repr__(self): - return f'' \ No newline at end of file + return f'' + diff --git a/trainingmgr/schemas/trainingjob_schema.py b/trainingmgr/schemas/trainingjob_schema.py index b93fd15..23d8a42 100644 --- a/trainingmgr/schemas/trainingjob_schema.py +++ b/trainingmgr/schemas/trainingjob_schema.py @@ -18,11 +18,28 @@ from trainingmgr.schemas import ma from trainingmgr.models import TrainingJob +from trainingmgr.models.trainingjob import ModelID +from marshmallow import pre_load + +class ModelSchema(ma.SQLAlchemyAutoSchema): + class Meta: + model = ModelID + load_instance = True class TrainingJobSchema(ma.SQLAlchemyAutoSchema): class Meta: model = TrainingJob - include_relationships = True load_instance = True + + modelId = ma.Nested(ModelSchema) + + @pre_load + def processModelId(self, data, **kwargs): + modelname = data['modelId']['modelname'] + modelversion = data['modelId']['modelversion'] + + modeldict = dict(modelname=modelname, modelversion=modelversion) + data['modelId'] = modeldict + return data \ No newline at end of file diff --git a/trainingmgr/service/training_job_service.py b/trainingmgr/service/training_job_service.py index d03d9d0..183d5b3 100644 --- a/trainingmgr/service/training_job_service.py +++ b/trainingmgr/service/training_job_service.py @@ -15,8 +15,13 @@ # limitations under the License. # # ================================================================================== -from trainingmgr.db.trainingjob_db import delete_trainingjob_by_id +from trainingmgr.db.trainingjob_db import delete_trainingjob_by_id, create_trainingjob from trainingmgr.common.exceptions_utls import DBException +from trainingmgr.schemas import TrainingJobSchema + +def create_training_job(data): + create_trainingjob(data) + def delete_training_job(training_job_id : int): """ -- 2.16.6