-
Notifications
You must be signed in to change notification settings - Fork 437
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Added services to be used by ConsistencyCheckJob
- Loading branch information
Showing
18 changed files
with
807 additions
and
0 deletions.
There are no files selected for viewing
39 changes: 39 additions & 0 deletions
39
src/api/app/services/consistency_check_job_service/backend_package_importer.rb
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
module ConsistencyCheckJobService | ||
class BackendPackageImporter | ||
attr_reader :errors | ||
|
||
def initialize(project, package_name) | ||
@project = project | ||
@package = @project.packages.build(name: package_name) | ||
@errors = [] | ||
end | ||
|
||
def call | ||
create_package_frontend | ||
rescue ActiveRecord::RecordInvalid, | ||
Backend::NotFoundError | ||
delete_package | ||
@errors << delete_error_message | ||
end | ||
|
||
private | ||
|
||
def delete_error_message | ||
"DELETED in backend due to invalid data #{@project.name}/#{@package.name}" | ||
end | ||
|
||
def create_package_frontend | ||
@package.commit_opts = { no_backend_write: 1 } | ||
@package.update_from_xml!(Xmlhash.parse(meta)) | ||
@package.save! | ||
end | ||
|
||
def meta | ||
Backend::Api::Sources::Project.meta(@project) | ||
end | ||
|
||
def delete_package | ||
Backend::Api::Sources::Package.delete(@project.name, @package.name) | ||
end | ||
end | ||
end |
37 changes: 37 additions & 0 deletions
37
src/api/app/services/consistency_check_job_service/backend_project_importer.rb
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
module ConsistencyCheckJobService | ||
class BackendProjectImporter | ||
attr_reader :errors | ||
|
||
def initialize(project_name) | ||
@project = Project.new(name: project_name) | ||
@errors = [] | ||
end | ||
|
||
def call | ||
create_project_frontend | ||
rescue APIError => e | ||
@errors << "Invalid project meta data hosted in src server for project #{@project}: #{e}" | ||
rescue ActiveRecord::RecordInvalid | ||
delete_source | ||
@errors << "DELETED #{@project} on backend due to invalid data" | ||
rescue Backend::NotFoundError | ||
@errors << "specified #{@project} does not exist on backend" | ||
end | ||
|
||
private | ||
|
||
def create_project_frontend | ||
@project.commit_opts = { no_backend_write: 1 } | ||
@project.update_from_xml!(Xmlhash.parse(meta)) | ||
@project.save! | ||
end | ||
|
||
def meta | ||
Backend::Api::Sources::Project.meta(@project) | ||
end | ||
|
||
def delete_source | ||
Backend::Api::Sources::Project.delete(@project) | ||
end | ||
end | ||
end |
27 changes: 27 additions & 0 deletions
27
src/api/app/services/consistency_check_job_service/base_consistency_checker.rb
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
module ConsistencyCheckJobService | ||
class BaseConsistencyChecker | ||
def initialize(_project = nil) | ||
@diff_backend_frontend = [] | ||
@diff_frontend_backend = [] | ||
end | ||
|
||
def call | ||
# generate diffs | ||
diff_frontend_backend | ||
diff_backend_frontend | ||
self | ||
end | ||
|
||
def diff_frontend_backend | ||
@diff_frontend_backend ||= (list_frontend - list_backend) | ||
end | ||
|
||
def diff_backend_frontend | ||
@diff_backend_frontend ||= (list_backend - list_frontend) | ||
end | ||
|
||
def dir_to_array(xmlhash) | ||
xmlhash.elements('entry').collect { |e| e['name'] }.sort | ||
end | ||
end | ||
end |
26 changes: 26 additions & 0 deletions
26
src/api/app/services/consistency_check_job_service/package_consistency_checker.rb
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
module ConsistencyCheckJobService | ||
class PackageConsistencyChecker < BaseConsistencyChecker | ||
def initialize(project) | ||
@project = project | ||
super | ||
end | ||
|
||
def list_frontend | ||
@project.packages.pluck(:name) | ||
end | ||
|
||
# filter multibuild source container | ||
def list_backend | ||
list_backend_packages.map { |e| e.start_with?('_patchinfo:', '_product:') ? e : e.gsub(/:.*$/, '') } | ||
end | ||
|
||
private | ||
|
||
def list_backend_packages | ||
dir_to_array(Xmlhash.parse(Backend::Api::Sources::Project.packages(@project.name))) | ||
# project disappeared ... may happen in running system | ||
rescue Backend::NotFoundError | ||
return [] | ||
end | ||
end | ||
end |
18 changes: 18 additions & 0 deletions
18
src/api/app/services/consistency_check_job_service/project_consistency_checker.rb
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
module ConsistencyCheckJobService | ||
class ProjectConsistencyChecker < BaseConsistencyChecker | ||
def initialize | ||
super | ||
end | ||
|
||
def list_frontend | ||
Project.order(:name).pluck(:name) | ||
end | ||
|
||
def list_backend | ||
dir_to_array(Xmlhash.parse(Backend::Api::Sources::Project.list)) | ||
rescue Backend::NotFoundError | ||
# project disappeared ... may happen in running system | ||
return [] | ||
end | ||
end | ||
end |
55 changes: 55 additions & 0 deletions
55
src/api/app/services/consistency_check_job_service/project_meta_checker.rb
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
module ConsistencyCheckJobService | ||
class ProjectMetaChecker | ||
attr_reader :errors | ||
|
||
def initialize(project) | ||
@project = project | ||
@errors = [] | ||
end | ||
|
||
def call | ||
@errors << "Project meta is different in backend for #{@project.name}\n#{diff}" if diff.present? | ||
end | ||
|
||
private | ||
|
||
def diff | ||
hash_diff(frontend_meta, backend_meta) | ||
end | ||
|
||
def frontend_meta | ||
Xmlhash.parse(@project.to_axml) | ||
end | ||
|
||
def backend_meta | ||
Xmlhash.parse(Backend::Api::Sources::Project.meta(@project)) | ||
end | ||
|
||
def hash_diff(a, b) | ||
# ignore the order inside of the hash | ||
(a.keys | b.keys).sort!.each_with_object({}) do |diff, k| | ||
a_ = a[k] | ||
b_ = b[k] | ||
# we need to ignore the ordering in some cases | ||
# old xml generator wrote them in a different order | ||
# but in other cases the order of elements matters | ||
if k == 'person' && a_.is_a?(Array) | ||
a_ = a_.map { |i| "#{i['userid']}/#{i['role']}" }.sort! | ||
b_ = b_.map { |i| "#{i['userid']}/#{i['role']}" }.sort! | ||
end | ||
if k == 'group' && a_.is_a?(Array) | ||
a_ = a_.map { |i| "#{i['groupid']}/#{i['role']}" }.sort! | ||
b_ = b_.map { |i| "#{i['groupid']}/#{i['role']}" }.sort! | ||
end | ||
if a_ != b_ | ||
if a[k].class == Hash && b[k].class == Hash | ||
diff[k] = hash_diff(a[k], b[k]) | ||
else | ||
diff[k] = [a[k], b[k]] | ||
end | ||
end | ||
diff | ||
end | ||
end | ||
end | ||
end |
153 changes: 153 additions & 0 deletions
153
...kJobService_BackendPackageImporter/_call/it_raises_ActiveRecord_RecordInvalid/1_1_1_1.yml
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
Oops, something went wrong.