Skip to content

Commit

Permalink
feat(APIv2): RHINENG-8970 implemented missing fields on rules
Browse files Browse the repository at this point in the history
  • Loading branch information
skateman committed Apr 25, 2024
1 parent c20fb95 commit 816ff3a
Show file tree
Hide file tree
Showing 19 changed files with 3,826 additions and 2,632 deletions.
3 changes: 2 additions & 1 deletion app/serializers/v2/rule_serializer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
module V2
# JSON serialization for an OpenSCAP Rule
class RuleSerializer < V2::ApplicationSerializer
attributes :ref_id, :title, :rationale, :description, :severity, :precedence
attributes :ref_id, :title, :rationale, :description, :severity,
:precedence, :identifier, :references, :value_checks

derived_attribute :remediation_issue_id, :remediation_available, profiles: [:ref_id], security_guide: [:ref_id]
end
Expand Down
9 changes: 9 additions & 0 deletions db/functions/v2_rules_delete_v01.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
CREATE OR REPLACE FUNCTION v2_rules_delete() RETURNS trigger LANGUAGE plpgsql AS
$func$
BEGIN
-- Delete the rule reference record separately
DELETE FROM "rule_references_containers" WHERE "rule_id" = OLD."id";
DELETE FROM "rules" WHERE "id" = OLD."id";
RETURN OLD;
END
$func$;
44 changes: 44 additions & 0 deletions db/functions/v2_rules_insert_v01.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
CREATE OR REPLACE FUNCTION v2_rules_insert() RETURNS trigger LANGUAGE plpgsql AS
$func$
DECLARE result_id uuid;
BEGIN
INSERT INTO "rules" (
"ref_id",
"title",
"severity",
"description",
"rationale",
"created_at",
"updated_at",
"remediation_available",
"benchmark_id",
"upstream",
"precedence",
"rule_group_id",
"value_checks",
"identifier"
) VALUES (
NEW."ref_id",
NEW."title",
NEW."severity",
NEW."description",
NEW."rationale",
NEW."created_at",
NEW."updated_at",
NEW."remediation_available",
NEW."security_guide_id",
NEW."upstream",
NEW."precedence",
NEW."rule_group_id",
NEW."value_checks",
NEW."identifier"
) RETURNING "id" INTO "result_id";

-- Insert a new rule reference record separately
INSERT INTO "rule_references_containers" ("rule_references", "rule_id", "created_at", "updated_at")
SELECT NEW."references", "result_id", NOW(), NOW();

NEW."id" := "result_id";
RETURN NEW;
END
$func$;
26 changes: 26 additions & 0 deletions db/functions/v2_rules_update_v01.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
CREATE OR REPLACE FUNCTION v2_rules_update() RETURNS trigger LANGUAGE plpgsql AS
$func$
BEGIN
-- Update the rule reference record separately
UPDATE "rule_references_container" SET "rule_references" = NEW."references" WHERE "rule_id" = OLD."id";

UPDATE "rules" SET
"ref_id" = NEW."ref_id",
"title" = NEW."title",
"severity" = NEW."severity",
"description" = NEW."description",
"rationale" = NEW."rationale",
"created_at" = NEW."created_at",
"updated_at" = NEW."updated_at",
"remediation_available" = NEW."remediation_available",
"benchmark_id" = NEW."security_guide_id",
"upstream" = NEW."upstream",
"precedence" = NEW."precedence",
"rule_group_id" = NEW."rule_group_id",
"value_checks" = NEW."value_checks",
"identifier" = NEW."identifier"
WHERE "id" = OLD."id";

RETURN NEW;
END
$func$;
6 changes: 6 additions & 0 deletions db/migrate/20240423093616_update_v2_rules_to_version_2.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
class UpdateV2RulesToVersion2 < ActiveRecord::Migration[7.1]
def change

update_view :v2_rules, version: 2, revert_to_version: 1
end
end
5 changes: 5 additions & 0 deletions db/migrate/20240423105337_create_function_v2_rules_insert.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
class CreateFunctionV2RulesInsert < ActiveRecord::Migration[7.1]
def change
create_function :v2_rules_insert
end
end
5 changes: 5 additions & 0 deletions db/migrate/20240423110153_create_function_v2_rules_update.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
class CreateFunctionV2RulesUpdate < ActiveRecord::Migration[7.1]
def change
create_function :v2_rules_update
end
end
5 changes: 5 additions & 0 deletions db/migrate/20240423110737_create_function_v2_rules_delete.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
class CreateFunctionV2RulesDelete < ActiveRecord::Migration[7.1]
def change
create_function :v2_rules_delete
end
end
5 changes: 5 additions & 0 deletions db/migrate/20240423111001_create_trigger_v2_rules_insert.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
class CreateTriggerV2RulesInsert < ActiveRecord::Migration[7.1]
def change
create_trigger :v2_rules_insert, on: :v2_rules
end
end
5 changes: 5 additions & 0 deletions db/migrate/20240423111009_create_trigger_v2_rules_update.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
class CreateTriggerV2RulesUpdate < ActiveRecord::Migration[7.1]
def change
create_trigger :v2_rules_update, on: :v2_rules
end
end
5 changes: 5 additions & 0 deletions db/migrate/20240423111013_create_trigger_v2_rules_delete.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
class CreateTriggerV2RulesDelete < ActiveRecord::Migration[7.1]
def change
create_trigger :v2_rules_delete, on: :v2_rules
end
end
150 changes: 125 additions & 25 deletions db/schema.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.

ActiveRecord::Schema[7.1].define(version: 2024_04_09_085523) do
ActiveRecord::Schema[7.1].define(version: 2024_04_23_111013) do
create_schema "inventory"

# These are extensions that must be enabled in order to support this database
Expand Down Expand Up @@ -290,26 +290,6 @@
value_definitions.benchmark_id AS security_guide_id
FROM value_definitions;
SQL
create_view "v2_rules", sql_definition: <<-SQL
SELECT rules.id,
rules.ref_id,
rules.supported,
rules.title,
rules.severity,
rules.description,
rules.rationale,
rules.created_at,
rules.updated_at,
rules.slug,
rules.remediation_available,
rules.benchmark_id AS security_guide_id,
rules.upstream,
rules.precedence,
rules.rule_group_id,
rules.value_checks,
rules.identifier
FROM rules;
SQL
create_view "tailorings", sql_definition: <<-SQL
SELECT profiles.id,
profiles.policy_id,
Expand Down Expand Up @@ -411,6 +391,26 @@
test_results.updated_at
FROM test_results;
SQL
create_view "v2_rules", sql_definition: <<-SQL
SELECT rules.id,
rules.ref_id,
rules.title,
rules.severity,
rules.description,
rules.rationale,
rules.created_at,
rules.updated_at,
rules.remediation_available,
rules.benchmark_id AS security_guide_id,
rules.upstream,
rules.precedence,
rules.rule_group_id,
rules.value_checks,
rules.identifier,
rule_references_containers.rule_references AS "references"
FROM (rules
LEFT JOIN rule_references_containers ON ((rule_references_containers.rule_id = rules.id)));
SQL
create_function :v2_policies_insert, sql_definition: <<-'SQL'
CREATE OR REPLACE FUNCTION public.v2_policies_insert()
RETURNS trigger
Expand Down Expand Up @@ -540,18 +540,118 @@
END
$function$
SQL
create_function :v2_rules_insert, sql_definition: <<-'SQL'
CREATE OR REPLACE FUNCTION public.v2_rules_insert()
RETURNS trigger
LANGUAGE plpgsql
AS $function$
DECLARE result_id uuid;
BEGIN
INSERT INTO "rules" (
"ref_id",
"title",
"severity",
"description",
"rationale",
"created_at",
"updated_at",
"remediation_available",
"benchmark_id",
"upstream",
"precedence",
"rule_group_id",
"value_checks",
"identifier"
) VALUES (
NEW."ref_id",
NEW."title",
NEW."severity",
NEW."description",
NEW."rationale",
NEW."created_at",
NEW."updated_at",
NEW."remediation_available",
NEW."security_guide_id",
NEW."upstream",
NEW."precedence",
NEW."rule_group_id",
NEW."value_checks",
NEW."identifier"
) RETURNING "id" INTO "result_id";
-- Insert a new rule reference record separately
INSERT INTO "rule_references_containers" ("rule_references", "rule_id", "created_at", "updated_at")
SELECT NEW."references", "result_id", NOW(), NOW();
NEW."id" := "result_id";
RETURN NEW;
END
$function$
SQL
create_function :v2_rules_update, sql_definition: <<-'SQL'
CREATE OR REPLACE FUNCTION public.v2_rules_update()
RETURNS trigger
LANGUAGE plpgsql
AS $function$
BEGIN
-- Update the rule reference record separately
UPDATE "rule_references_container" SET "rule_references" = NEW."references" WHERE "rule_id" = OLD."id";
UPDATE "rules" SET
"ref_id" = NEW."ref_id",
"title" = NEW."title",
"severity" = NEW."severity",
"description" = NEW."description",
"rationale" = NEW."rationale",
"created_at" = NEW."created_at",
"updated_at" = NEW."updated_at",
"remediation_available" = NEW."remediation_available",
"benchmark_id" = NEW."security_guide_id",
"upstream" = NEW."upstream",
"precedence" = NEW."precedence",
"rule_group_id" = NEW."rule_group_id",
"value_checks" = NEW."value_checks",
"identifier" = NEW."identifier"
WHERE "id" = OLD."id";
RETURN NEW;
END
$function$
SQL
create_function :v2_rules_delete, sql_definition: <<-'SQL'
CREATE OR REPLACE FUNCTION public.v2_rules_delete()
RETURNS trigger
LANGUAGE plpgsql
AS $function$
BEGIN
-- Delete the rule reference record separately
DELETE FROM "rule_references_containers" WHERE "rule_id" = OLD."id";
DELETE FROM "rules" WHERE "id" = OLD."id";
RETURN OLD;
END
$function$
SQL


create_trigger :tailorings_insert, sql_definition: <<-SQL
CREATE TRIGGER tailorings_insert INSTEAD OF INSERT ON public.tailorings FOR EACH ROW EXECUTE FUNCTION tailorings_insert()
SQL
create_trigger :v2_policies_update, sql_definition: <<-SQL
CREATE TRIGGER v2_policies_update INSTEAD OF UPDATE ON public.v2_policies FOR EACH ROW EXECUTE FUNCTION v2_policies_update()
create_trigger :v2_policies_insert, sql_definition: <<-SQL
CREATE TRIGGER v2_policies_insert INSTEAD OF INSERT ON public.v2_policies FOR EACH ROW EXECUTE FUNCTION v2_policies_insert()
SQL
create_trigger :v2_policies_delete, sql_definition: <<-SQL
CREATE TRIGGER v2_policies_delete INSTEAD OF DELETE ON public.v2_policies FOR EACH ROW EXECUTE FUNCTION v2_policies_delete()
SQL
create_trigger :v2_policies_insert, sql_definition: <<-SQL
CREATE TRIGGER v2_policies_insert INSTEAD OF INSERT ON public.v2_policies FOR EACH ROW EXECUTE FUNCTION v2_policies_insert()
create_trigger :v2_policies_update, sql_definition: <<-SQL
CREATE TRIGGER v2_policies_update INSTEAD OF UPDATE ON public.v2_policies FOR EACH ROW EXECUTE FUNCTION v2_policies_update()
SQL
create_trigger :v2_rules_update, sql_definition: <<-SQL
CREATE TRIGGER v2_rules_update INSTEAD OF UPDATE ON public.v2_rules FOR EACH ROW EXECUTE FUNCTION v2_rules_update()
SQL
create_trigger :v2_rules_insert, sql_definition: <<-SQL
CREATE TRIGGER v2_rules_insert INSTEAD OF INSERT ON public.v2_rules FOR EACH ROW EXECUTE FUNCTION v2_rules_insert()
SQL
create_trigger :v2_rules_delete, sql_definition: <<-SQL
CREATE TRIGGER v2_rules_delete INSTEAD OF DELETE ON public.v2_rules FOR EACH ROW EXECUTE FUNCTION v2_rules_delete()
SQL
end
2 changes: 2 additions & 0 deletions db/triggers/v2_rules_delete_v01.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
CREATE TRIGGER "v2_rules_delete" INSTEAD OF DELETE ON "v2_rules"
FOR EACH ROW EXECUTE FUNCTION v2_rules_delete();
2 changes: 2 additions & 0 deletions db/triggers/v2_rules_insert_v01.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
CREATE TRIGGER "v2_rules_insert" INSTEAD OF INSERT ON "v2_rules"
FOR EACH ROW EXECUTE FUNCTION v2_rules_insert();
2 changes: 2 additions & 0 deletions db/triggers/v2_rules_update_v01.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
CREATE TRIGGER "v2_rules_update" INSTEAD OF UPDATE ON "v2_rules"
FOR EACH ROW EXECUTE FUNCTION v2_rules_update();
18 changes: 18 additions & 0 deletions db/views/v2_rules_v02.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
SELECT
"rules"."id",
"rules"."ref_id",
"rules"."title",
"rules"."severity",
"rules"."description",
"rules"."rationale",
"rules"."created_at",
"rules"."updated_at",
"rules"."remediation_available",
"rules"."benchmark_id" AS "security_guide_id",
"rules"."upstream",
"rules"."precedence",
"rules"."rule_group_id",
"rules"."value_checks",
"rules"."identifier",
"rule_references_containers"."rule_references" AS "references"
FROM "rules" LEFT OUTER JOIN "rule_references_containers" ON "rule_references_containers"."rule_id" = "rules"."id";
10 changes: 8 additions & 2 deletions spec/controllers/v2/rules_controller_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,10 @@
rationale: :rationale,
description: :description,
severity: :severity,
precedence: :precedence
precedence: :precedence,
references: :references,
identifier: :identifier,
value_checks: :value_checks
}
end

Expand Down Expand Up @@ -63,7 +66,10 @@
description: :description,
severity: :severity,
remediation_issue_id: :remediation_issue_id,
precedence: :precedence
precedence: :precedence,
references: :references,
identifier: :identifier,
value_checks: :value_checks
}
end

Expand Down
4 changes: 4 additions & 0 deletions spec/factories/rule.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,10 @@
description { Faker::Lorem.paragraph }
severity { %w[low medium high].sample }
precedence { Faker::Number.between(from: 1, to: 9999) }
identifier { { label: Faker::Fantasy::Tolkien.character, href: Faker::Internet.url } }
references { rand(0..5).times.map { { label: Faker::Fantasy::Tolkien.character, href: Faker::Internet.url } } }
remediation_available { false }
upstream { false }

security_guide do
if profile_id
Expand Down
Loading

0 comments on commit 816ff3a

Please sign in to comment.