From a9bd4c5bc84f78972f2df4a8455f554ee1b64ce9 Mon Sep 17 00:00:00 2001 From: Eduardo Bonet <ebonet@gitlab.com> Date: Mon, 17 Jul 2023 12:59:37 +0200 Subject: [PATCH] Creates Ml::ModelVersion on package creation When a package of type ml_model_package is created through the api, creates also a companion Ml::ModelVersion Changelog: added FeatureFlag: model_registry --- app/models/ml/model_version.rb | 4 ++-- .../find_or_create_model_version_service.rb | 2 +- .../ml_model/create_package_file_service.rb | 15 ++++++++++++- spec/models/ml/model_version_spec.rb | 4 ++-- .../create_package_file_service_spec.rb | 21 +++++++++++-------- 5 files changed, 31 insertions(+), 15 deletions(-) diff --git a/app/models/ml/model_version.rb b/app/models/ml/model_version.rb index 3450dc64b79f3..934b924e4afe8 100644 --- a/app/models/ml/model_version.rb +++ b/app/models/ml/model_version.rb @@ -19,8 +19,8 @@ class ModelVersion < ApplicationRecord delegate :name, to: :model class << self - def find_or_create(model, version, package) - create_with(package: package).find_or_create_by(project: model.project, model: model, version: version) + def find_or_create!(model, version, package) + create_with(package: package).find_or_create_by!(project: model.project, model: model, version: version) end end diff --git a/app/services/ml/find_or_create_model_version_service.rb b/app/services/ml/find_or_create_model_version_service.rb index 558374ad57bd0..1316b2546b9d8 100644 --- a/app/services/ml/find_or_create_model_version_service.rb +++ b/app/services/ml/find_or_create_model_version_service.rb @@ -12,7 +12,7 @@ def initialize(project, params = {}) def execute model = Ml::FindOrCreateModelService.new(project, name).execute - Ml::ModelVersion.find_or_create(model, version, package) + Ml::ModelVersion.find_or_create!(model, version, package) end private diff --git a/app/services/packages/ml_model/create_package_file_service.rb b/app/services/packages/ml_model/create_package_file_service.rb index 574f70940fcf3..b1e8e8140159d 100644 --- a/app/services/packages/ml_model/create_package_file_service.rb +++ b/app/services/packages/ml_model/create_package_file_service.rb @@ -5,7 +5,10 @@ module MlModel class CreatePackageFileService < BaseService def execute ::Packages::Package.transaction do - create_package_file(find_or_create_package) + package = find_or_create_package + find_or_create_model_version(package) + + create_package_file(package) end end @@ -30,6 +33,16 @@ def find_or_create_package package end + def find_or_create_model_version(package) + model_version_params = { + model_name: package.name, + version: package.version, + package: package + } + + Ml::FindOrCreateModelVersionService.new(project, model_version_params).execute + end + def create_package_file(package) file_params = { file: params[:file], diff --git a/spec/models/ml/model_version_spec.rb b/spec/models/ml/model_version_spec.rb index 9af9a2a56c6c7..7b8410f99a889 100644 --- a/spec/models/ml/model_version_spec.rb +++ b/spec/models/ml/model_version_spec.rb @@ -88,13 +88,13 @@ end end - describe '.find_or_create' do + describe '#find_or_create!' do let_it_be(:existing_model_version) { create(:ml_model_versions, model: model, version: 'abc') } let(:version) { existing_model_version.version } let(:package) { nil } - subject(:find_or_create) { described_class.find_or_create(model, version, package) } + subject(:find_or_create) { described_class.find_or_create!(model, version, package) } context 'if model version exists' do it 'returns the model version', :aggregate_failures do diff --git a/spec/services/packages/ml_model/create_package_file_service_spec.rb b/spec/services/packages/ml_model/create_package_file_service_spec.rb index d749aee227a70..32754279e1724 100644 --- a/spec/services/packages/ml_model/create_package_file_service_spec.rb +++ b/spec/services/packages/ml_model/create_package_file_service_spec.rb @@ -41,19 +41,22 @@ .to change { project.packages.ml_model.count }.by(1) .and change { Packages::PackageFile.count }.by(1) .and change { Packages::PackageFileBuildInfo.count }.by(0) + .and change { Ml::ModelVersion.count }.by(1) new_model = project.packages.ml_model.last package_file = new_model.package_files.last + new_model_version = Ml::ModelVersion.last - aggregate_failures do - expect(new_model.name).to eq('new_model') - expect(new_model.version).to eq('1.0.0') - expect(new_model.status).to eq('default') - expect(package_file.package).to eq(new_model) - expect(package_file.file_name).to eq(file_name) - expect(package_file.size).to eq(file.size) - expect(package_file.file_sha256).to eq(sha256) - end + expect(new_model.name).to eq('new_model') + expect(new_model.version).to eq('1.0.0') + expect(new_model.status).to eq('default') + expect(package_file.package).to eq(new_model) + expect(package_file.file_name).to eq(file_name) + expect(package_file.size).to eq(file.size) + expect(package_file.file_sha256).to eq(sha256) + expect(new_model_version.name).to eq('new_model') + expect(new_model_version.version).to eq('1.0.0') + expect(new_model_version.package).to eq(new_model) end end -- GitLab