Skip to content
Snippets Groups Projects
Verified Commit 9df5f6cf authored by Océane Legrand's avatar Océane Legrand :rocket: Committed by GitLab
Browse files

Added Packages_conan_package_revisions table and model

Changelog: added
parent 8756b28e
No related branches found
No related tags found
2 merge requests!170053Security patch upgrade alert: Only expose to admins 17-4,!167144Added Packages_conan_package_revisions table and model Changelog: added
Showing
with 225 additions and 0 deletions
......@@ -11,6 +11,8 @@ class Package < Packages::Package
has_many :conan_package_references, inverse_of: :package, class_name: 'Packages::Conan::PackageReference'
has_many :conan_package_revisions, inverse_of: :package, class_name: 'Packages::Conan::PackageRevision'
accepts_nested_attributes_for :conan_metadatum
delegate :recipe, :recipe_path, to: :conan_metadatum, prefix: :conan
......
......@@ -16,6 +16,8 @@ class PackageReference < ApplicationRecord
inverse_of: :conan_package_references
belongs_to :project
has_many :package_revisions, inverse_of: :package_reference, class_name: 'Packages::Conan::PackageRevision'
validates :package, :project, presence: true
validates :reference, presence: true, bytesize: { maximum: -> { REFERENCE_LENGTH_MAX } },
uniqueness: { scope: [:package_id, :recipe_revision_id] }
......
# frozen_string_literal: true
module Packages
module Conan
class PackageRevision < ApplicationRecord
include ShaAttribute
REVISION_LENGTH_MAX = 20
sha_attribute :revision
belongs_to :package, class_name: 'Packages::Conan::Package', inverse_of: :conan_package_revisions
belongs_to :package_reference, class_name: 'Packages::Conan::PackageReference',
inverse_of: :package_revisions
belongs_to :project
validates :package, :package_reference, :project, presence: true
validates :revision, presence: true, bytesize: { maximum: -> { REVISION_LENGTH_MAX } },
uniqueness: { scope: [:package_id, :package_reference_id] }
end
end
end
---
table_name: packages_conan_package_revisions
classes:
- Packages::Conan::PackageRevision
feature_categories:
- package_registry
description: Package Revision
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/167144
milestone: '17.5'
gitlab_schema: gitlab_main_cell
sharding_key:
project_id: projects
# frozen_string_literal: true
class CreatePackagesConanPackageRevisions < Gitlab::Database::Migration[2.2]
milestone '17.5'
UNIQ_IND_PACKAGE_REFERENCE_REVISION = 'uniq_idx_on_packages_conan_package_revisions_revision'
def change
create_table :packages_conan_package_revisions do |t| # rubocop:disable Migration/EnsureFactoryForTable -- https://gitlab.com/gitlab-org/gitlab/-/issues/468630
t.bigint :package_id, null: false
t.bigint :project_id, null: false
t.bigint :package_reference_id, null: false
t.timestamps_with_timezone null: false
t.binary :revision, null: false, limit: 20 # It is either an MD5 hash (16 bytes) or a SHA-1 hash (20 bytes)
t.index :project_id
t.index :package_reference_id
t.index [:package_id, :package_reference_id, :revision], unique: true, name: UNIQ_IND_PACKAGE_REFERENCE_REVISION
end
end
end
# frozen_string_literal: true
class AddPackageIdAsForeignKeyInPackagesConanPackageRevisions < Gitlab::Database::Migration[2.2]
milestone '17.5'
disable_ddl_transaction!
def up
add_concurrent_foreign_key :packages_conan_package_revisions, :packages_packages, column: :package_id,
on_delete: :cascade
end
def down
with_lock_retries do
remove_foreign_key :packages_conan_package_revisions, column: :package_id
end
end
end
# frozen_string_literal: true
class AddProjectIdAsForeignKeyInPackagesConanPackageRevisions < Gitlab::Database::Migration[2.2]
milestone '17.5'
disable_ddl_transaction!
def up
add_concurrent_foreign_key :packages_conan_package_revisions, :projects, column: :project_id, on_delete: :cascade
end
def down
with_lock_retries do
remove_foreign_key :packages_conan_package_revisions, column: :project_id
end
end
end
# frozen_string_literal: true
class AddPackageReferenceIdAsForeignKeyInPackagesConanPackageRevisions < Gitlab::Database::Migration[2.2]
milestone '17.5'
disable_ddl_transaction!
def up
add_concurrent_foreign_key :packages_conan_package_revisions, :packages_conan_package_references,
column: :package_reference_id, on_delete: :cascade
end
def down
with_lock_retries do
remove_foreign_key :packages_conan_package_revisions, column: :package_reference_id
end
end
end
90eaec699835993470ed8b1df34a908532aa8def9ee599e296a020e71f05a8fb
\ No newline at end of file
7a7fbf9ac9b81ed5178bb80cdcdd2be01acbc1c8ae198e922e76bde1e2a2c2df
\ No newline at end of file
0ea1c4c36e2ddb88033b928d5ddd39290313650312d7947efdcd63fa1bcfafec
\ No newline at end of file
7515e7a251ce343eae09df9318ed6497ceaff4a290f90e404866cc4109d3c311
\ No newline at end of file
......@@ -14825,6 +14825,25 @@ CREATE SEQUENCE packages_conan_package_references_id_seq
 
ALTER SEQUENCE packages_conan_package_references_id_seq OWNED BY packages_conan_package_references.id;
 
CREATE TABLE packages_conan_package_revisions (
id bigint NOT NULL,
package_id bigint NOT NULL,
project_id bigint NOT NULL,
package_reference_id bigint NOT NULL,
created_at timestamp with time zone NOT NULL,
updated_at timestamp with time zone NOT NULL,
revision bytea NOT NULL
);
CREATE SEQUENCE packages_conan_package_revisions_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER SEQUENCE packages_conan_package_revisions_id_seq OWNED BY packages_conan_package_revisions.id;
CREATE TABLE packages_conan_recipe_revisions (
id bigint NOT NULL,
package_id bigint NOT NULL,
......@@ -22283,6 +22302,8 @@ ALTER TABLE ONLY packages_conan_metadata ALTER COLUMN id SET DEFAULT nextval('pa
 
ALTER TABLE ONLY packages_conan_package_references ALTER COLUMN id SET DEFAULT nextval('packages_conan_package_references_id_seq'::regclass);
 
ALTER TABLE ONLY packages_conan_package_revisions ALTER COLUMN id SET DEFAULT nextval('packages_conan_package_revisions_id_seq'::regclass);
ALTER TABLE ONLY packages_conan_recipe_revisions ALTER COLUMN id SET DEFAULT nextval('packages_conan_recipe_revisions_id_seq'::regclass);
 
ALTER TABLE ONLY packages_debian_group_architectures ALTER COLUMN id SET DEFAULT nextval('packages_debian_group_architectures_id_seq'::regclass);
......@@ -24751,6 +24772,9 @@ ALTER TABLE ONLY packages_conan_metadata
ALTER TABLE ONLY packages_conan_package_references
ADD CONSTRAINT packages_conan_package_references_pkey PRIMARY KEY (id);
 
ALTER TABLE ONLY packages_conan_package_revisions
ADD CONSTRAINT packages_conan_package_revisions_pkey PRIMARY KEY (id);
ALTER TABLE ONLY packages_conan_recipe_revisions
ADD CONSTRAINT packages_conan_recipe_revisions_pkey PRIMARY KEY (id);
 
......@@ -29719,6 +29743,10 @@ CREATE INDEX index_packages_conan_package_references_on_project_id ON packages_c
 
CREATE INDEX index_packages_conan_package_references_on_recipe_revision_id ON packages_conan_package_references USING btree (recipe_revision_id);
 
CREATE INDEX index_packages_conan_package_revisions_on_package_reference_id ON packages_conan_package_revisions USING btree (package_reference_id);
CREATE INDEX index_packages_conan_package_revisions_on_project_id ON packages_conan_package_revisions USING btree (project_id);
CREATE INDEX index_packages_conan_recipe_revisions_on_project_id ON packages_conan_recipe_revisions USING btree (project_id);
 
CREATE INDEX index_packages_debian_group_architectures_on_group_id ON packages_debian_group_architectures USING btree (group_id);
......@@ -31417,6 +31445,8 @@ CREATE UNIQUE INDEX uniq_google_cloud_logging_configuration_namespace_id_and_nam
 
CREATE UNIQUE INDEX uniq_idx_on_packages_conan_package_references_package_reference ON packages_conan_package_references USING btree (package_id, recipe_revision_id, reference);
 
CREATE UNIQUE INDEX uniq_idx_on_packages_conan_package_revisions_revision ON packages_conan_package_revisions USING btree (package_id, package_reference_id, revision);
CREATE UNIQUE INDEX uniq_idx_packages_packages_on_project_id_name_version_ml_model ON packages_packages USING btree (project_id, name, version) WHERE ((package_type = 14) AND (status <> 4));
 
CREATE UNIQUE INDEX uniq_idx_project_compliance_framework_on_project_framework ON project_compliance_framework_settings USING btree (project_id, framework_id);
......@@ -33979,6 +34009,9 @@ ALTER TABLE ONLY csv_issue_imports
ALTER TABLE ONLY milestone_releases
ADD CONSTRAINT fk_5e73b8cad2 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
 
ALTER TABLE ONLY packages_conan_package_revisions
ADD CONSTRAINT fk_5f7c6a9244 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
ALTER TABLE ONLY project_access_tokens
ADD CONSTRAINT fk_5f7e8450e1 FOREIGN KEY (personal_access_token_id) REFERENCES personal_access_tokens(id) ON DELETE CASCADE;
 
......@@ -34465,6 +34498,9 @@ ALTER TABLE ONLY issues
ALTER TABLE ONLY duo_workflows_checkpoints
ADD CONSTRAINT fk_b3d9cea509 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
 
ALTER TABLE ONLY packages_conan_package_revisions
ADD CONSTRAINT fk_b482b1a2f8 FOREIGN KEY (package_reference_id) REFERENCES packages_conan_package_references(id) ON DELETE CASCADE;
ALTER TABLE ONLY protected_tag_create_access_levels
ADD CONSTRAINT fk_b4eb82fe3c FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE;
 
......@@ -34957,6 +34993,9 @@ ALTER TABLE ONLY import_placeholder_memberships
ALTER TABLE ONLY project_import_data
ADD CONSTRAINT fk_ffb9ee3a10 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
 
ALTER TABLE ONLY packages_conan_package_revisions
ADD CONSTRAINT fk_ffc5836122 FOREIGN KEY (package_id) REFERENCES packages_packages(id) ON DELETE CASCADE;
ALTER TABLE ONLY issues
ADD CONSTRAINT fk_ffed080f01 FOREIGN KEY (updated_by_id) REFERENCES users(id) ON DELETE SET NULL;
 
# frozen_string_literal: true
FactoryBot.define do
factory :conan_package_revision, class: 'Packages::Conan::PackageRevision' do
package { association(:conan_package) }
association :project
package_reference { association(:conan_package_reference) }
sequence(:revision) { |n| Digest::SHA1.digest(n.to_s) } # rubocop:disable Fips/SHA1 -- The conan registry is not FIPS compliant
end
end
......@@ -14,6 +14,11 @@
end
it { is_expected.to belong_to(:project) }
it do
is_expected.to have_many(:package_revisions).inverse_of(:package_reference)
.class_name('Packages::Conan::PackageRevision')
end
end
describe 'validations' do
......
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe Packages::Conan::PackageRevision, type: :model, feature_category: :package_registry do
describe 'associations' do
it do
is_expected.to belong_to(:package).class_name('Packages::Conan::Package').inverse_of(:conan_package_revisions)
end
it do
is_expected.to belong_to(:package_reference).class_name('Packages::Conan::PackageReference')
.inverse_of(:package_revisions)
end
it { is_expected.to belong_to(:project) }
end
describe 'validations' do
subject(:package_revision) { build(:conan_package_revision) }
it { is_expected.to validate_presence_of(:package) }
it { is_expected.to validate_presence_of(:package_reference) }
it { is_expected.to validate_presence_of(:project) }
it { is_expected.to validate_presence_of(:revision) }
it do
# ignore case, same revision string with different case are converted to same hexa binary
is_expected.to validate_uniqueness_of(:revision).scoped_to([:package_id, :package_reference_id]).case_insensitive
end
context 'when validating the byte size of revision' do
let(:invalid_revision) { 'a' * (Packages::Conan::PackageRevision::REVISION_LENGTH_MAX + 1) }
it 'is not valid if revision exceeds maximum byte size', :aggregate_failures do
package_revision.revision = invalid_revision
expect(package_revision).not_to be_valid
expect(package_revision.errors[:revision]).to include(
"is too long (#{Packages::Conan::PackageRevision::REVISION_LENGTH_MAX + 1} B). " \
"The maximum size is #{Packages::Conan::PackageRevision::REVISION_LENGTH_MAX} B.")
end
it 'is valid if revision is within byte size limit' do
# package revision is set correctly in the factory
expect(package_revision).to be_valid
end
end
end
end
......@@ -15,6 +15,11 @@
is_expected.to have_many(:conan_package_references).inverse_of(:package)
.class_name('Packages::Conan::PackageReference')
end
it do
is_expected.to have_many(:conan_package_revisions).inverse_of(:package)
.class_name('Packages::Conan::PackageRevision')
end
end
describe 'validations' do
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment