Project

General

Profile

Download (8.44 KB) Statistics
| Branch: | Tag: | Revision:
module Katello
module Pulp3
class RepositoryMirror
attr_accessor :repo_service
delegate :repo, to: :repo_service
delegate :smart_proxy, to: :repo_service

delegate :api, to: :repo_service

def initialize(repository_service)
@repo_service = repository_service
end

def content_guard_href
content_guard_api = ::Katello::Pulp3::Api::ContentGuard.new(smart_proxy)
content_guard_api.list&.results&.first&.pulp_href
end

def backend_object_name
#Create repos in pulp3 instance with the name as this repo's pulp_id
repo.pulp_id
end

def refresh_entities
href = remote_href
if href
if remote_options[:url]&.start_with?('uln')
[api.remotes_uln_api.partial_update(href, remote_options)]
else
[api.remotes_api.partial_update(href, remote_options)]
end
else
create_remote
[]
end
end

def needs_updates?
remote = fetch_remote
return true if remote.blank?
options = repo_service.compute_remote_options
options.keys.any? { |key| remote.send(key) != options[key] }
end

def remote_href
fetch_remote.try(:pulp_href)
end

def create_entities
create
create_remote unless fetch_remote
end

def create(_force = false)
api.repositories_api.create(name: backend_object_name)
end

def update
api.repositories_api.update(repository_href, name: backend_object_name)
end

def delete(href = repository_href)
api.repositories_api.delete(href) if href
rescue api.api_exception_class => e
raise e if e.code != 404
nil
end

def repository_href
fetch_repository.try(:pulp_href)
end

def fetch_repository
repo_service.api.list_all(name: backend_object_name).first
end

def version_href
fetch_repository&.latest_version_href
end

def publication_href
if repo_service.repo.content_type == "deb"
api.publications_verbatim_api.list(:repository_version => version_href).results.first&.pulp_href
else
api.publications_api.list(:repository_version => version_href).results.first&.pulp_href
end
end

def create_version(options = {})
api.repository_versions_api.create(repository_href, options)
end

def distribution_options(path, options = {})
ret = {
base_path: path,
name: "#{backend_object_name}"
}
ret[:content_guard] = repo.unprotected ? nil : content_guard_href
ret[:publication] = options[:publication] if options.key? :publication
ret[:repository_version] = options[:repository_version] if options.key? :repository_version
ret
end

def remote_options
base_options = common_remote_options
base_options.merge!(url: remote_feed_url)
if (type_specific_options = repo_service.try(:mirror_remote_options))
base_options.merge!(type_specific_options)
end
base_options
end

def create_remote
if remote_options[:url]&.start_with?('uln')
remote_file_data = @repo_service.api.class.remote_uln_class.new(remote_options)
api.remotes_uln_api.create(remote_file_data)
else
remote_file_data = @repo_service.api.remote_class.new(remote_options)
api.remotes_api.create(remote_file_data)
end
end

def compute_remote_options
repo_service.compute_remote_options(remote_options)
end

def fetch_remote
api.remotes_list(name: backend_object_name).first
end

def sync(options = {})
sync_params = repo_service.sync_url_params(options)
sync_params[:remote] = remote_href
if repo.yum?
sync_params.delete(:skip_types) if sync_params[:skip_types]
sync_params[:sync_policy] = 'mirror_complete'
else
sync_params.delete(:sync_policy)
sync_params[:mirror] = true
end
repository_sync_url_data = api.repository_sync_url_class.new(sync_params)
[api.repositories_api.sync(repository_href, repository_sync_url_data)]
end

def common_remote_options
remote_options = {
name: backend_object_name,
total_timeout: Setting[:sync_total_timeout],
connect_timeout: Setting[:sync_connect_timeout_v2],
sock_connect_timeout: Setting[:sync_sock_connect_timeout],
sock_read_timeout: Setting[:sync_sock_read_timeout],
rate_limit: Setting[:download_rate_limit]
}
remote_options.merge!({download_concurrency: repo.download_concurrency}) if repo.download_concurrency
remote_options.merge!(ssl_remote_options)
end

def ssl_remote_options
ueber_cert = ::Cert::Certs.ueber_cert(repo.root.organization)
{
client_cert: ueber_cert[:cert],
client_key: ueber_cert[:key],
ca_cert: ::Cert::Certs.ca_cert,
tls_validation: true
}
end

def remote_feed_url
uri = ::SmartProxy.pulp_primary.pulp3_uri!
uri.path = repo_service.partial_repo_path
uri.to_s
end

def publication_options(repository_version)
popts = {repository_version: repository_version}
if (type_specific_options = repo_service.try(:mirror_publication_options))
popts.merge!(type_specific_options)
end
popts
end

def create_publication
if (href = version_href)
if repo_service.repo.content_type == "deb"
publication_data = api.publication_verbatim_class.new({repository_version: href})
api.publications_verbatim_api.create(publication_data)
else
publication_data = api.publication_class.new(publication_options(href))
api.publications_api.create(publication_data)
end
end
end

def refresh_distributions(_options = {})
path = repo_service.relative_path
dist_params = {}
if repo_service.repo.repository_type.pulp3_skip_publication
dist_params[:repository_version] = version_href
fail "could not lookup a version_href for repo #{repo_service.repo.id}" if version_href.nil?
else
dist_params[:publication] = publication_href
fail "Could not lookup a publication_href for repo #{repo_service.repo.id}" if publication_href.nil?
end

dist_options = distribution_options(path, dist_params)
dist_options.delete(:content_guard) if repo_service.repo.content_type == "docker"
if (distro = repo_service.lookup_distributions(base_path: path).first) ||
(distro = repo_service.lookup_distributions(name: "#{backend_object_name}").first)
# update dist
dist_options = dist_options.except(:name)
api.distributions_api.partial_update(distro.pulp_href, dist_options)
else
# create dist
distribution_data = api.distribution_class.new(dist_options)
api.distributions_api.create(distribution_data)
end
end

def count_by_pulpcore_type(service_class)
# Currently only supports SRPMs and Docker Manifest Lists
fail NotImplementedError unless [::Katello::Pulp3::Srpm, ::Katello::Pulp3::DockerManifestList].include?(service_class)
count = service_class.content_api(smart_proxy).list(service_class.page_options(limit: 1, fields: ['count'], repository_version: version_href)).count
return 0 if count.nil?
count
end

def latest_content_counts
version_pulp_href = version_href
return unless version_pulp_href
api.repository_versions_api.read(version_pulp_href)&.content_summary&.present
end

def pulp3_enabled_repo_types
Katello::RepositoryTypeManager.enabled_repository_types.values.select do |repository_type|
smart_proxy.pulp3_repository_type_support?(repository_type)
end
end

def create_distribution(path)
distribution_data = api.distribution_class.new(distribution_options(path))
repo_service.distributions_api.create(distribution_data)
end

def repair
data = api.repair_class.new
fail "Could not lookup a version_href for repo #{repo_service.repo.id}" if version_href.nil?
api.repository_versions_api.repair(version_href, data)
end
end
end
end
(17-17/25)