Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions database/schema/upgrade_scripts/168-add-arch-enum.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
CREATE TYPE arch AS ENUM ('aarch64', 'i386', 'i686', 'noarch', 'ppc', 'ppc64', 'ppc64le', 's390', 's390x', 'src', 'x86_64');
8 changes: 8 additions & 0 deletions database/schema/upgrade_scripts/169-add-evr-table.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
CREATE TABLE IF NOT EXISTS evr (
id SERIAL,
epoch INTEGER NOT NULL,
version TEXT NOT NULL,
release TEXT NOT NULL,
PRIMARY KEY (id),
UNIQUE (epoch, version, release)
) TABLESPACE pg_default;
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
CREATE TABLE IF NOT EXISTS system_vulnerabilities_pkg_detail (
rh_account_id BIGINT NOT NULL,
system_vulnerability_id BIGINT NOT NULL,
package_name_id BIGINT NOT NULL,
affected_evr_id INTEGER NOT NULL,
affected_arch arch NOT NULL,
fixed_evr_id INTEGER,
fixed_arch arch,
CONSTRAINT package_name_id
FOREIGN KEY (package_name_id)
REFERENCES package_name (id),
CONSTRAINT affected_evr_id
FOREIGN KEY (affected_evr_id)
REFERENCES evr (id),
CONSTRAINT fixed_evr_id
FOREIGN KEY (fixed_evr_id)
REFERENCES evr (id)
) PARTITION BY HASH (rh_account_id);

CREATE OR REPLACE FUNCTION create_sys_vuln_pkg_detail_partitions(parts INTEGER)
RETURNS VOID AS
$$
DECLARE
I INTEGER;
BEGIN
I := 0;
WHILE I < parts
LOOP
EXECUTE 'CREATE TABLE IF NOT EXISTS system_vulnerabilities_pkg_detail_' || text(I) ||
' PARTITION OF system_vulnerabilities_pkg_detail FOR VALUES WITH ( MODULUS ' || text(parts) ||
', REMAINDER ' || text(I) || ') TABLESPACE pg_default;';
EXECUTE 'ALTER TABLE system_vulnerabilities_pkg_detail_' || text(I) ||
' ADD PRIMARY KEY (system_vulnerability_id, package_name_id);';
EXECUTE 'ALTER TABLE system_vulnerabilities_pkg_detail_' || text(I) || ' ADD CONSTRAINT system_vulnerabilities_pkg_detail_' ||
text(I) || '_system_vulnerability_id_fkey FOREIGN KEY (system_vulnerability_id) REFERENCES '
'system_vulnerabilities_active_' || text(I) || '(id) ON DELETE CASCADE;';
I = I + 1;
END LOOP;
END;
$$ LANGUAGE plpgsql;

SELECT create_sys_vuln_pkg_detail_partitions(256);
DROP FUNCTION create_sys_vuln_pkg_detail_partitions;
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
ALTER TABLE system_vulnerable_package ADD COLUMN affected_evr_id INTEGER;

ALTER TABLE system_vulnerable_package ADD COLUMN affected_arch arch;

-- cannot add NOT VALID foreign key on partitioned table "system_vulnerable_package" referencing relation "evr"
-- DETAIL: This feature is not yet supported on partitioned tables.
-- This is why adding it for each partition separately
CREATE OR REPLACE FUNCTION add_sys_vuln_pkg_affected_evr_constraints(parts INTEGER)
RETURNS VOID AS
$$
DECLARE
I INTEGER;
BEGIN
I := 0;
WHILE I < parts
LOOP
EXECUTE 'ALTER TABLE system_vulnerable_package_' || text(I) || ' ADD CONSTRAINT system_vulnerable_package_' || text(I) ||
'_affected_evr_id_fkey FOREIGN KEY (affected_evr_id) REFERENCES evr (id) NOT VALID;';
I = I + 1;
END LOOP;
END;
$$ LANGUAGE plpgsql;

SELECT add_sys_vuln_pkg_affected_evr_constraints(256);
DROP FUNCTION add_sys_vuln_pkg_affected_evr_constraints;
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
CREATE OR REPLACE FUNCTION validate_sys_vuln_pkg_affected_evr_constraints(parts INTEGER)
RETURNS VOID AS
$$
DECLARE
I INTEGER;
BEGIN
I := 0;
WHILE I < parts
LOOP
EXECUTE 'ALTER TABLE system_vulnerable_package_' || text(I) || ' VALIDATE CONSTRAINT system_vulnerable_package_' ||
text(I) || '_affected_evr_id_fkey;';
I = I + 1;
END LOOP;
END;
$$ LANGUAGE plpgsql;

SELECT validate_sys_vuln_pkg_affected_evr_constraints(256);
DROP FUNCTION validate_sys_vuln_pkg_affected_evr_constraints;
68 changes: 67 additions & 1 deletion database/schema/ve_db_postgresql.sql
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ CREATE TABLE IF NOT EXISTS db_version (
) TABLESPACE pg_default;

-- set the schema version directly in the insert statement here!!
INSERT INTO db_version (name, version) VALUES ('schema_version', 167);
INSERT INTO db_version (name, version) VALUES ('schema_version', 172);
-- INSERT INTO db_version (name, version) VALUES ('schema_version', :schema_version);


Expand Down Expand Up @@ -123,6 +123,13 @@ $delete_system$
CREATE COLLATION IF NOT EXISTS numeric (provider = icu, locale = 'en-u-kn-true');


-- ----------------------------------------------------------------------------
-- Enums
-- ----------------------------------------------------------------------------

CREATE TYPE arch AS ENUM ('aarch64', 'i386', 'i686', 'noarch', 'ppc', 'ppc64', 'ppc64le', 's390', 's390x', 'src', 'x86_64');


-- ----------------------------------------------------------------------------
-- Tables
-- ----------------------------------------------------------------------------
Expand Down Expand Up @@ -654,6 +661,61 @@ CREATE TABLE IF NOT EXISTS package_name (
PRIMARY KEY (id)
) TABLESPACE pg_default;

-- epoch, version, release table
CREATE TABLE IF NOT EXISTS evr (
id SERIAL,
epoch INTEGER NOT NULL,
version TEXT NOT NULL,
release TEXT NOT NULL,
PRIMARY KEY (id),
UNIQUE (epoch, version, release)
) TABLESPACE pg_default;

-- system vulnerability package detail table
CREATE TABLE IF NOT EXISTS system_vulnerabilities_pkg_detail (
rh_account_id BIGINT NOT NULL,
system_vulnerability_id BIGINT NOT NULL,
package_name_id BIGINT NOT NULL,
affected_evr_id INTEGER NOT NULL,
affected_arch arch NOT NULL,
fixed_evr_id INTEGER,
fixed_arch arch,
CONSTRAINT package_name_id
FOREIGN KEY (package_name_id)
REFERENCES package_name (id),
CONSTRAINT affected_evr_id
FOREIGN KEY (affected_evr_id)
REFERENCES evr (id),
CONSTRAINT fixed_evr_id
FOREIGN KEY (fixed_evr_id)
REFERENCES evr (id)
) PARTITION BY HASH (rh_account_id);

CREATE OR REPLACE FUNCTION create_sys_vuln_pkg_detail_partitions(parts INTEGER)
RETURNS VOID AS
$$
DECLARE
I INTEGER;
BEGIN
I := 0;
WHILE I < parts
LOOP
EXECUTE 'CREATE TABLE IF NOT EXISTS system_vulnerabilities_pkg_detail_' || text(I) ||
' PARTITION OF system_vulnerabilities_pkg_detail FOR VALUES WITH ( MODULUS ' || text(parts) ||
', REMAINDER ' || text(I) || ') TABLESPACE pg_default;';
EXECUTE 'ALTER TABLE system_vulnerabilities_pkg_detail_' || text(I) ||
' ADD PRIMARY KEY (system_vulnerability_id, package_name_id);';
EXECUTE 'ALTER TABLE system_vulnerabilities_pkg_detail_' || text(I) || ' ADD CONSTRAINT system_vulnerabilities_pkg_detail_' ||
text(I) || '_system_vulnerability_id_fkey FOREIGN KEY (system_vulnerability_id) REFERENCES '
'system_vulnerabilities_active_' || text(I) || '(id) ON DELETE CASCADE;';
I = I + 1;
END LOOP;
END;
$$ LANGUAGE plpgsql;

SELECT create_sys_vuln_pkg_detail_partitions(256);
DROP FUNCTION create_sys_vuln_pkg_detail_partitions;

-- cpe table
CREATE TABLE IF NOT EXISTS cpe (
id BIGSERIAL,
Expand Down Expand Up @@ -714,6 +776,8 @@ CREATE TABLE IF NOT EXISTS system_vulnerable_package (
rh_account_id BIGINT NOT NULL,
system_id BIGINT NOT NULL,
vulnerable_package_id BIGINT NOT NULL,
affected_evr_id INTEGER,
affected_arch arch,
first_reported TIMESTAMP WITH TIME ZONE NOT NULL,
CONSTRAINT rh_account_id
FOREIGN KEY (rh_account_id)
Expand Down Expand Up @@ -741,6 +805,8 @@ BEGIN
EXECUTE 'ALTER TABLE system_vulnerable_package_' || text(I) || ' ADD PRIMARY KEY (id);';
EXECUTE 'ALTER TABLE system_vulnerable_package_' || text(I) || ' ADD CONSTRAINT system_vulnerable_package_' || text(I) ||
'_system_id_vuln_pkg_id_key UNIQUE (system_id, vulnerable_package_id);';
EXECUTE 'ALTER TABLE system_vulnerable_package_' || text(I) || ' ADD CONSTRAINT system_vulnerable_package_' || text(I) ||
'_affected_evr_id_fkey FOREIGN KEY (affected_evr_id) REFERENCES evr (id);';
EXECUTE 'CREATE INDEX ON system_vulnerable_package_' || text(I) || '(vulnerable_package_id);';
EXECUTE 'CREATE INDEX ON system_vulnerable_package_' || text(I) || '(rh_account_id);';
EXECUTE 'CREATE TRIGGER system_vulnerable_package_set_first_reported BEFORE INSERT ON system_vulnerable_package_' || text(I) ||
Expand Down
2 changes: 1 addition & 1 deletion tests/data/truncate_dev_data.sql
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
TRUNCATE TABLE repo, system_repo, timestamp_kv, cve_account_data, cve_rule_mapping, playbook, notified_accounts, package_name, cpe, vulnerable_package, vulnerable_package_cve, system_vulnerable_package, system_cve_data;
TRUNCATE TABLE repo, system_repo, timestamp_kv, cve_account_data, cve_rule_mapping, playbook, notified_accounts, package_name, evr, cpe, vulnerable_package, vulnerable_package_cve, system_vulnerable_package, system_vulnerabilities_pkg_detail, system_cve_data;
DELETE FROM system_vulnerabilities WHERE rh_account_id in (0, 1); -- truncating can't be restricted to selected partitions and truncating all takes too long
DELETE FROM insights_rule;
DELETE FROM system_platform;
Expand Down
2 changes: 1 addition & 1 deletion tests/taskomatic_tests/test_db_metrics.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,4 @@ def test_db_metrics(pg_db_conn, monkeypatch): # pylint: disable=unused-argument
dm.run()

assert dm.METRIC_SYSTEMS.collect()[0].samples[0].value == 33 # there are 33 systems in DB
assert len(dm.METRIC_TABLE_SIZE.collect()[0].samples) == 547 # number of tables in DB
assert len(dm.METRIC_TABLE_SIZE.collect()[0].samples) == 805 # number of tables in DB
Loading