Skip to content

Commit 828e5d0

Browse files
committed
feat(V2): RHINENG-11269 use the V2 models for SSG import
1 parent 9556f4b commit 828e5d0

31 files changed

+179
-1550
lines changed

app/models/v2/profile.rb

+9
Original file line numberDiff line numberDiff line change
@@ -30,5 +30,14 @@ def variant_for_minor(version)
3030
os_minor_versions: { os_minor_version: version }
3131
)
3232
end
33+
34+
def self.from_parser(obj, existing: nil, security_guide_id: nil, value_overrides: nil)
35+
record = existing || new(ref_id: obj.id, security_guide_id: security_guide_id)
36+
37+
record.assign_attributes(title: obj.title, description: obj.description,
38+
value_overrides: value_overrides, upstream: false)
39+
40+
record
41+
end
3342
end
3443
end

app/models/v2/rule.rb

+18
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ class Rule < ApplicationRecord
1010

1111
indexable_by :ref_id, &->(scope, value) { scope.find_by!(ref_id: value.try(:gsub, '-', '.')) }
1212

13+
attr_accessor :op_source
14+
1315
# rubocop:disable Metrics/AbcSize
1416
def self.sorted_severities(table = arel_table)
1517
Arel.sql(
@@ -71,5 +73,21 @@ def remediation_issue_id
7173
def self.short_ref_id(ref_id)
7274
ref_id.downcase[SHORT_REF_ID_RE] || ref_id
7375
end
76+
77+
# rubocop:disable Metrics/ParameterLists
78+
def self.from_parser(obj, existing: nil, rule_group_id: nil,
79+
security_guide_id: nil, precedence: nil, value_checks: nil)
80+
record = existing || new(ref_id: obj.id, security_guide_id: security_guide_id)
81+
82+
record.op_source = obj
83+
84+
record.assign_attributes(title: obj.title, description: obj.description, rationale: obj.rationale,
85+
severity: obj.severity, precedence: precedence, rule_group_id: rule_group_id,
86+
upstream: false, value_checks: value_checks, identifier: obj.identifier&.to_h,
87+
references: obj.references.map(&:to_h), remediation_available: false)
88+
89+
record
90+
end
91+
# rubocop:enable Metrics/ParameterLists
7492
end
7593
end

app/models/v2/rule_group.rb

+9
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,14 @@ class RuleGroup < ApplicationRecord
1616

1717
searchable_by :title, %i[like unlike eq ne]
1818
searchable_by :ref_id, %i[like unlike]
19+
20+
def self.from_parser(obj, existing: nil, security_guide_id: nil, parent_id: nil, precedence: nil)
21+
record = existing || new(ref_id: obj.id, security_guide_id: security_guide_id)
22+
23+
record.assign_attributes(title: obj.title, description: obj.description, rationale: obj.rationale,
24+
precedence: precedence, parent_id: parent_id)
25+
26+
record
27+
end
1928
end
2029
end

app/models/v2/security_guide.rb

+6
Original file line numberDiff line numberDiff line change
@@ -39,5 +39,11 @@ class SecurityGuide < ApplicationRecord
3939
def self.os_versions
4040
reselect(:os_major_version).distinct.reorder(:os_major_version).map(&:os_major_version)
4141
end
42+
43+
def self.from_parser(obj)
44+
record = find_or_initialize_by(ref_id: obj.id, version: obj.version)
45+
record.assign_attributes(title: obj.title, description: obj.description)
46+
record
47+
end
4248
end
4349
end

app/models/v2/value_definition.rb

+10
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ class ValueDefinition < ApplicationRecord
1515
searchable_by :title, %i[like unlike eq ne]
1616
searchable_by :ref_id, %i[like unlike]
1717

18+
attr_accessor :op_source
19+
1820
def validate_value(value)
1921
return false unless value.is_a?(String)
2022

@@ -27,5 +29,13 @@ def validate_value(value)
2729
true
2830
end
2931
end
32+
33+
def self.from_parser(obj, existing: nil, security_guide_id: nil)
34+
record = existing || new(ref_id: obj.id, security_guide_id: security_guide_id)
35+
record.op_source = obj
36+
record.assign_attributes(title: obj.title, description: obj.description,
37+
value_type: obj.type, default_value: obj.value)
38+
record
39+
end
3040
end
3141
end

app/services/concerns/xccdf/benchmarks.rb

-48
This file was deleted.

app/services/concerns/xccdf/hosts.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ def test_result_profile
2626
name: @test_result_file.test_result.profile_id
2727
).find_or_initialize_by(
2828
ref_id: @test_result_file.test_result.profile_id,
29-
benchmark: benchmark
29+
benchmark_id: security_guide.id
3030
)
3131
end
3232
end

app/services/concerns/xccdf/profile_os_minor_versions.rb

+6-6
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ module ProfileOsMinorVersions
77

88
included do
99
def save_profile_os_minor_versions
10-
::ProfileOsMinorVersion.transaction do
10+
::V2::ProfileOsMinorVersion.transaction do
1111
# Delete all existing mappings for the given benchmark
1212
old_profile_os_minor_versions.delete_all
1313
# Import the new mappings
14-
::ProfileOsMinorVersion.import!(new_profile_os_minor_versions)
14+
::V2::ProfileOsMinorVersion.import!(new_profile_os_minor_versions)
1515
end
1616
end
1717

@@ -20,18 +20,18 @@ def save_profile_os_minor_versions
2020
def new_profile_os_minor_versions
2121
@profiles.flat_map do |profile|
2222
os_minor_versions.map do |os_minor_version|
23-
::ProfileOsMinorVersion.new(profile: profile, os_minor_version: os_minor_version)
23+
::V2::ProfileOsMinorVersion.new(profile: profile, os_minor_version: os_minor_version)
2424
end
2525
end
2626
end
2727

2828
def old_profile_os_minor_versions
29-
@old_profile_os_minor_versions ||= ::ProfileOsMinorVersion.where(profile: @profiles.map(&:id))
29+
@old_profile_os_minor_versions ||= ::V2::ProfileOsMinorVersion.where(profile: @profiles.map(&:id))
3030
end
3131

3232
def os_minor_versions
33-
SupportedSsg.by_ssg_version(true)[@benchmark.version]
34-
.select { |ssg| ssg.os_major_version == @benchmark.os_major_version }
33+
SupportedSsg.by_ssg_version(true)[@security_guide.version]
34+
.select { |ssg| ssg.os_major_version == @security_guide.os_major_version }
3535
.map(&:os_minor_version)
3636
end
3737
end

app/services/concerns/xccdf/profile_rules.rb

+8-9
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,14 @@ module ProfileRules
77

88
included do
99
def save_profile_rules
10-
::ProfileRule.transaction do
11-
::ProfileRule.import!(profile_rules,
12-
on_duplicate_key_update: {
13-
conflict_target: %i[rule_id profile_id],
14-
columns: %i[rule_id profile_id]
15-
})
10+
::V2::ProfileRule.transaction do
11+
::V2::ProfileRule.import!(profile_rules,
12+
on_duplicate_key_update: {
13+
conflict_target: %i[rule_id profile_id],
14+
columns: %i[rule_id profile_id]
15+
})
1616

17-
base = ::ProfileRule.joins(profile: :benchmark)
18-
.where('profiles.parent_profile_id' => nil)
17+
base = ::V2::ProfileRule.joins(profile: :security_guide)
1918

2019
profile_rule_links_to_remove(base).delete_all
2120
end
@@ -36,7 +35,7 @@ def profile_rules
3635

3736
def profile_rule_links_to_remove(base)
3837
grouped_rules = profile_rules.group_by(&:profile_id)
39-
grouped_rules.reduce(ProfileRule.none) do |query, (profile_id, prs)|
38+
grouped_rules.reduce(V2::ProfileRule.none) do |query, (profile_id, prs)|
4039
query.or(
4140
base.where(profile_id: profile_id)
4241
.where.not(rule_id: prs.map(&:rule_id))

app/services/concerns/xccdf/profiles.rb

+11-12
Original file line numberDiff line numberDiff line change
@@ -8,27 +8,26 @@ module Profiles
88
included do
99
def profiles
1010
@profiles ||= @op_profiles.map do |op_profile|
11-
::Profile.from_openscap_parser(
11+
::V2::Profile.from_parser(
1212
op_profile,
1313
existing: old_profiles[op_profile.id],
14-
benchmark_id: @benchmark&.id,
14+
security_guide_id: @security_guide.id,
1515
value_overrides: value_overrides(op_profile)
1616
)
1717
end
1818
end
1919

2020
def save_profiles
2121
# Import the new records first with validation
22-
::Profile.import!(new_profiles, ignore: true)
22+
::V2::Profile.import!(new_profiles, ignore: true)
2323

2424
# Update the fields on existing profiles, validation is not necessary
25-
::Profile.import(old_profiles.values,
26-
on_duplicate_key_update: {
27-
conflict_target: %i[ref_id benchmark_id],
28-
columns: %i[name value_overrides],
29-
index_predicate: 'parent_profile_id IS NULL'
30-
},
31-
validate: false)
25+
::V2::Profile.import(old_profiles.values,
26+
on_duplicate_key_update: {
27+
conflict_target: %i[ref_id security_guide_id],
28+
columns: %i[name value_overrides]
29+
},
30+
validate: false)
3231
end
3332

3433
private
@@ -38,8 +37,8 @@ def new_profiles
3837
end
3938

4039
def old_profiles
41-
@old_profiles ||= ::Profile.where(
42-
ref_id: @op_profiles.map(&:id), benchmark: @benchmark&.id, parent_profile_id: nil
40+
@old_profiles ||= ::V2::Profile.where(
41+
ref_id: @op_profiles.map(&:id), security_guide_id: @security_guide.id
4342
).index_by(&:ref_id)
4443
end
4544

app/services/concerns/xccdf/rule_group_relationships.rb

-54
This file was deleted.

app/services/concerns/xccdf/rule_groups.rb

+19-15
Original file line numberDiff line numberDiff line change
@@ -7,31 +7,35 @@ module RuleGroups
77

88
included do
99
def save_rule_groups
10-
@rule_groups ||= @op_rule_groups.each_with_index.map do |op_rule_group, idx|
11-
::RuleGroup.from_openscap_parser(op_rule_group,
12-
existing: old_rule_groups[op_rule_group.id],
13-
precedence: idx, benchmark_id: @benchmark&.id)
14-
end
15-
16-
::RuleGroup.import!(new_rule_groups, ignore: true)
10+
::V2::RuleGroup.import!(new_rule_groups, ignore: true)
1711

1812
# Overwite a superset of old_rule_groups because the IDs of the ancestors are not
1913
# available in the first import! above
20-
::RuleGroup.import(rule_groups_with_ancestry, on_duplicate_key_update: {
21-
conflict_target: %i[ref_id benchmark_id],
22-
columns: %i[description rationale precedence ancestry]
23-
}, validate: false)
14+
::V2::RuleGroup.import(rule_groups_with_ancestry, on_duplicate_key_update: {
15+
conflict_target: %i[ref_id security_guide_id],
16+
columns: %i[description rationale precedence ancestry]
17+
}, validate: false)
2418
end
2519

2620
private
2721

22+
def rule_groups
23+
@rule_groups ||= @op_rule_groups.each_with_index.map do |op_rule_group, idx|
24+
::V2::RuleGroup.from_parser(
25+
op_rule_group,
26+
existing: old_rule_groups[op_rule_group.id], precedence: idx,
27+
security_guide_id: @security_guide.id
28+
)
29+
end
30+
end
31+
2832
def new_rule_groups
29-
@new_rule_groups ||= @rule_groups.select(&:new_record?)
33+
@new_rule_groups ||= rule_groups.select(&:new_record?)
3034
end
3135

3236
def old_rule_groups
33-
@old_rule_groups ||= ::RuleGroup.where(
34-
ref_id: @op_rule_groups.map(&:id), benchmark: @benchmark&.id
37+
@old_rule_groups ||= ::V2::RuleGroup.where(
38+
ref_id: @op_rule_groups.map(&:id), security_guide_id: @security_guide.id
3539
).index_by(&:ref_id)
3640
end
3741

@@ -50,7 +54,7 @@ def rule_groups_with_ancestry
5054
end
5155

5256
def rule_group_for(ref_id:)
53-
@cached_rule_groups ||= @rule_groups.index_by(&:ref_id)
57+
@cached_rule_groups ||= rule_groups.index_by(&:ref_id)
5458
@cached_rule_groups[ref_id]
5559
end
5660
end

0 commit comments

Comments
 (0)