Class: Katello::Pulp3::RepositoryMirror

Inherits:
Object
  • Object
show all
Defined in:
app/services/katello/pulp3/repository_mirror.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(repository_service) ⇒ RepositoryMirror

Returns a new instance of RepositoryMirror.



10
11
12
# File 'app/services/katello/pulp3/repository_mirror.rb', line 10

def initialize(repository_service)
  @repo_service = repository_service
end

Instance Attribute Details

#repo_serviceObject

Returns the value of attribute repo_service.



4
5
6
# File 'app/services/katello/pulp3/repository_mirror.rb', line 4

def repo_service
  @repo_service
end

Instance Method Details

#backend_object_nameObject



19
20
21
22
# File 'app/services/katello/pulp3/repository_mirror.rb', line 19

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

#common_remote_optionsObject



145
146
147
148
149
150
151
# File 'app/services/katello/pulp3/repository_mirror.rb', line 145

def common_remote_options
  remote_options = {
    name: backend_object_name
  }
  remote_options.merge!({download_concurrency: repo.download_concurrency}) if repo.download_concurrency
  remote_options.merge!(ssl_remote_options)
end

#compute_remote_optionsObject



123
124
125
# File 'app/services/katello/pulp3/repository_mirror.rb', line 123

def compute_remote_options
  repo_service.compute_remote_options(remote_options)
end

#content_guard_hrefObject



14
15
16
17
# File 'app/services/katello/pulp3/repository_mirror.rb', line 14

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

#create(_force = false) ⇒ Object



54
55
56
# File 'app/services/katello/pulp3/repository_mirror.rb', line 54

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

#create_distribution(path) ⇒ Object



220
221
222
223
# File 'app/services/katello/pulp3/repository_mirror.rb', line 220

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

#create_entitiesObject



49
50
51
52
# File 'app/services/katello/pulp3/repository_mirror.rb', line 49

def create_entities
  create
  create_remote unless fetch_remote
end

#create_publicationObject



177
178
179
180
181
182
183
184
185
186
187
# File 'app/services/katello/pulp3/repository_mirror.rb', line 177

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

#create_remoteObject



113
114
115
116
117
118
119
120
121
# File 'app/services/katello/pulp3/repository_mirror.rb', line 113

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

#create_version(options = {}) ⇒ Object



89
90
91
# File 'app/services/katello/pulp3/repository_mirror.rb', line 89

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

#delete(href = repository_href) ⇒ Object



62
63
64
65
66
67
# File 'app/services/katello/pulp3/repository_mirror.rb', line 62

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

#distribution_options(path, options = {}) ⇒ Object



93
94
95
96
97
98
99
100
101
102
# File 'app/services/katello/pulp3/repository_mirror.rb', line 93

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

#fetch_remoteObject



127
128
129
# File 'app/services/katello/pulp3/repository_mirror.rb', line 127

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

#fetch_repositoryObject



73
74
75
# File 'app/services/katello/pulp3/repository_mirror.rb', line 73

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

#needs_updates?Boolean

Returns:

  • (Boolean)


38
39
40
41
42
43
# File 'app/services/katello/pulp3/repository_mirror.rb', line 38

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

#publication_hrefObject



81
82
83
84
85
86
87
# File 'app/services/katello/pulp3/repository_mirror.rb', line 81

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

#publication_options(repository_version) ⇒ Object



169
170
171
172
173
174
175
# File 'app/services/katello/pulp3/repository_mirror.rb', line 169

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

#pulp3_enabled_repo_typesObject



214
215
216
217
218
# File 'app/services/katello/pulp3/repository_mirror.rb', line 214

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

#refresh_distributions(_options = {}) ⇒ Object



189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
# File 'app/services/katello/pulp3/repository_mirror.rb', line 189

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

#refresh_entitiesObject



24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'app/services/katello/pulp3/repository_mirror.rb', line 24

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

#remote_feed_urlObject



163
164
165
166
167
# File 'app/services/katello/pulp3/repository_mirror.rb', line 163

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

#remote_hrefObject



45
46
47
# File 'app/services/katello/pulp3/repository_mirror.rb', line 45

def remote_href
  fetch_remote.try(:pulp_href)
end

#remote_optionsObject



104
105
106
107
108
109
110
111
# File 'app/services/katello/pulp3/repository_mirror.rb', line 104

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

#repository_hrefObject



69
70
71
# File 'app/services/katello/pulp3/repository_mirror.rb', line 69

def repository_href
  fetch_repository.try(:pulp_href)
end

#ssl_remote_optionsObject



153
154
155
156
157
158
159
160
161
# File 'app/services/katello/pulp3/repository_mirror.rb', line 153

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

#sync(options = {}) ⇒ Object



131
132
133
134
135
136
137
138
139
140
141
142
143
# File 'app/services/katello/pulp3/repository_mirror.rb', line 131

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

#updateObject



58
59
60
# File 'app/services/katello/pulp3/repository_mirror.rb', line 58

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

#version_hrefObject



77
78
79
# File 'app/services/katello/pulp3/repository_mirror.rb', line 77

def version_href
  fetch_repository.latest_version_href
end