Skip to content

Commit

Permalink
Added services to be used by ConsistencyCheckJob
Browse files Browse the repository at this point in the history
  • Loading branch information
vpereira committed Apr 27, 2020
1 parent 4eed391 commit deb49e7
Show file tree
Hide file tree
Showing 18 changed files with 807 additions and 0 deletions.
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
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
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
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
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
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

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit deb49e7

Please sign in to comment.