Class: Runcible::Extensions::Repository

Inherits:
Resources::Repository show all
Defined in:
lib/runcible/extensions/repository.rb

Instance Method Summary collapse

Methods inherited from Resources::Repository

#associate_distributor, #associate_importer, #create, #delete, #delete_distributor, #delete_importer, path, #publish, #regenerate_applicability, #retrieve, #retrieve_all, #search, #sync, #sync_history, #unassociate_units, #unit_copy, #unit_search, #update, #update_distributor, #update_importer

Methods inherited from Base

#add_http_auth_header, #add_oauth_header, #call, #combine_get_params, #config, #format_payload_json, #generate_log_message, #generate_payload, #get_response, #initialize, #lazy_config=, #log_debug, #log_exception, #logger, #path, #process_response, #required_params

Constructor Details

This class inherits a constructor from Runcible::Base

Instance Method Details

#create_or_update_schedule(repo_id, type, schedule) ⇒ RestClient::Response

Creates or updates a sync schedule for a repository

Parameters:

  • repo_id (String)

    the ID of the repository

  • type (String)

    the importer type

  • schedule (String)

    the time as an iso8601 interval

Returns:

  • (RestClient::Response)

    the newly created or updated schedule



301
302
303
304
305
306
307
308
309
# File 'lib/runcible/extensions/repository.rb', line 301

def create_or_update_schedule(repo_id, type, schedule)
  schedules = Runcible::Resources::RepositorySchedule.new(self.config).list(repo_id, type)
  if schedules.empty?
    Runcible::Resources::RepositorySchedule.new(self.config).create(repo_id, type, schedule)
  else
    Runcible::Resources::RepositorySchedule.new(self.config).update(repo_id, type,
                                                schedules[0]['_id'], :schedule => schedule)
  end
end

#create_with_distributors(id, distributors) ⇒ RestClient::Response

Utility function that allows distributors to be added at repository creation time

Parameters:

  • id (String)

    the id of the repository being created

  • distributors (Array)

    an array of hashes representing distributors or an array of Distributor objects

Returns:

  • (RestClient::Response)

    the created repository



43
44
45
# File 'lib/runcible/extensions/repository.rb', line 43

def create_with_distributors(id, distributors)
  create_with_importer_and_distributors(id, nil, distributors)
end

#create_with_importer(id, importer) ⇒ RestClient::Response

Utility function that allows an importer to be added at repository creation time

Parameters:

  • id (String)

    the id of the repository being created

  • importer (Hash, Runcible::Extensions::Importer)

    either a hash representing an importer or an Importer object

Returns:

  • (RestClient::Response)

    the created repository



33
34
35
# File 'lib/runcible/extensions/repository.rb', line 33

def create_with_importer(id, importer)
  create_with_importer_and_distributors(id, importer)
end

#create_with_importer_and_distributors(id, importer, distributors = [], optional = {}) ⇒ RestClient::Response

Utility function that allows an importer and distributors to be added at repository creation time

Parameters:

  • id (String)

    the id of the repository being created

  • importer (Hash, Runcible::Extensions::Importer)

    either a hash representing an importer or an Importer object

  • distributors (Array) (defaults to: [])

    an array of hashes representing distributors or an array of Distributor objects

  • optional (Hash) (defaults to: {})

    container for all optional parameters

Returns:

  • (RestClient::Response)

    the created repository



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# File 'lib/runcible/extensions/repository.rb', line 56

def create_with_importer_and_distributors(id, importer, distributors = [], optional = {})
  if importer.is_a?(Runcible::Models::Importer)
    optional[:importer_type_id] = importer.id
    optional[:importer_config] = importer.config
  else
    optional[:importer_type_id] = importer.delete('id') || importer.delete(:id)
    optional[:importer_config] = importer
  end if importer

  repo_type = if importer.methods.include?(:repo_type)
                importer.repo_type
              elsif importer.is_a?(Hash) && importer.key?(:repo_type)
                importer[:repo_type]
              else
                nil
              end

  if optional.key?(:importer_type_id) && repo_type
    # pulp needs _repo-type in order to determine the type of repo to create.
    optional[:notes] = { '_repo-type' => importer.repo_type }
  end

  optional[:distributors] = distributors.map do |d|
    if d.is_a?(Runcible::Models::Distributor)
      {'distributor_type_id' => d.type_id,
       'distributor_config' => d.config,
       'auto_publish' => d.auto_publish,
       'distributor_id' => d.id
      }
    else
      {'distributor_type_id' => d['type_id'],
       'distributor_config' => d['config'],
       'auto_publish' => d['auto_publish'],
       'distributor_id' => d['id']
      }
    end
  end unless distributors.empty?
  optional[:id] = id
  create(id, optional)
end

#distributions(id) ⇒ RestClient::Response

Retrieves the distributions for a single repository

Parameters:

  • id (String)

    the ID of the repository

Returns:

  • (RestClient::Response)

    the set of repository distributions



221
222
223
224
225
# File 'lib/runcible/extensions/repository.rb', line 221

def distributions(id)
  criteria = {:type_ids => [Runcible::Extensions::Distribution.content_type]}

  unit_search(id, criteria).map { |i| i['metadata'].with_indifferent_access }
end

#docker_image_ids(id) ⇒ RestClient::Response

Retrieves the docker image IDs for a single repository

Parameters:

  • id (String)

    the ID of the repository

Returns:

  • (RestClient::Response)

    the set of repository docker image IDs



270
271
272
273
274
275
# File 'lib/runcible/extensions/repository.rb', line 270

def docker_image_ids(id)
  criteria = {:type_ids => [Runcible::Extensions::DockerImage.content_type],
              :fields => {:unit => [], :association => ['unit_id']}}

  unit_search(id, criteria).map { |i| i['unit_id'] }
end

#docker_images(id) ⇒ RestClient::Response

Retrieves the docker images for a single repository

Parameters:

  • id (String)

    the ID of the repository

Returns:

  • (RestClient::Response)

    the set of repository docker images



281
282
283
284
# File 'lib/runcible/extensions/repository.rb', line 281

def docker_images(id)
  criteria = {:type_ids => [Runcible::Extensions::DockerImage.content_type]}
  unit_search(id, criteria).map { |i| i['metadata'].with_indifferent_access }
end

#errata(id) ⇒ RestClient::Response

Retrieves the errata for a single repository

Parameters:

  • id (String)

    the ID of the repository

Returns:

  • (RestClient::Response)

    the set of repository errata



212
213
214
215
# File 'lib/runcible/extensions/repository.rb', line 212

def errata(id)
  criteria = {:type_ids => [Runcible::Extensions::Errata.content_type]}
  unit_search(id, criteria).map { |i| i['metadata'].with_indifferent_access }
end

#errata_ids(id) ⇒ RestClient::Response

Retrieves the errata IDs for a single repository

Parameters:

  • id (String)

    the ID of the repository

Returns:

  • (RestClient::Response)

    the set of repository errata IDs



201
202
203
204
205
206
# File 'lib/runcible/extensions/repository.rb', line 201

def errata_ids(id)
  criteria = {:type_ids => [Runcible::Extensions::Errata.content_type],
              :fields => {:unit => [], :association => ['unit_id']}}

  unit_search(id, criteria).map { |i| i['unit_id'] }
end

#package_categories(id) ⇒ RestClient::Response

Retrieves the package group categoriess for a single repository

Parameters:

  • id (String)

    the ID of the repository

Returns:

  • (RestClient::Response)

    the set of repository package group categories



241
242
243
244
# File 'lib/runcible/extensions/repository.rb', line 241

def package_categories(id)
  criteria = {:type_ids => [Runcible::Extensions::PackageCategory.content_type]}
  unit_search(id, criteria).map { |i| i['metadata'].with_indifferent_access }
end

#package_groups(id) ⇒ RestClient::Response

Retrieves the package groups for a single repository

Parameters:

  • id (String)

    the ID of the repository

Returns:

  • (RestClient::Response)

    the set of repository package groups



231
232
233
234
235
# File 'lib/runcible/extensions/repository.rb', line 231

def package_groups(id)
  criteria = {:type_ids => [Runcible::Extensions::PackageGroup.content_type]}

  unit_search(id, criteria).map { |i| i['metadata'].with_indifferent_access }
end

#publish_all(repo_id) ⇒ RestClient::Response

Publishes a repository for all of it’s distributors

Parameters:

  • repo_id (String)

    the ID of the repository

Returns:

  • (RestClient::Response)

    set of tasks representing each publish



327
328
329
330
331
332
333
# File 'lib/runcible/extensions/repository.rb', line 327

def publish_all(repo_id)
  to_ret = []
  retrieve_with_details(repo_id)['distributors'].each do |d|
    to_ret << publish(repo_id, d['id'])
  end
  to_ret
end

#publish_status(repo_id) ⇒ RestClient::Response

Retrieves the publish status for a repository

Parameters:

  • repo_id (String)

    the repository ID

Returns:

  • (RestClient::Response)

    a task representing the sync status



109
110
111
# File 'lib/runcible/extensions/repository.rb', line 109

def publish_status(repo_id)
  Runcible::Resources::Task.new(self.config).list(["pulp:repository:#{repo_id}", 'pulp:action:publish'])
end

#puppet_module_ids(id) ⇒ RestClient::Response

Retrieves the puppet module IDs for a single repository

Parameters:

  • id (String)

    the ID of the repository

Returns:

  • (RestClient::Response)

    the set of repository puppet module IDs



250
251
252
253
254
255
# File 'lib/runcible/extensions/repository.rb', line 250

def puppet_module_ids(id)
  criteria = {:type_ids => [Runcible::Extensions::PuppetModule.content_type],
              :fields => {:unit => [], :association => ['unit_id']}}

  unit_search(id, criteria).map { |i| i['unit_id'] }
end

#puppet_modules(id) ⇒ RestClient::Response

Retrieves the puppet modules for a single repository

Parameters:

  • id (String)

    the ID of the repository

Returns:

  • (RestClient::Response)

    the set of repository puppet modules



261
262
263
264
# File 'lib/runcible/extensions/repository.rb', line 261

def puppet_modules(id)
  criteria = {:type_ids => [Runcible::Extensions::PuppetModule.content_type]}
  unit_search(id, criteria).map { |i| i['metadata'].with_indifferent_access }
end

#regenerate_applicability_by_ids(ids) ⇒ RestClient::Response

Regenerate the applicability for consumers bound to a given set of repositories

Parameters:

  • ids (String, Array)

    array of repo ids

Returns:

  • (RestClient::Response)


347
348
349
350
351
352
# File 'lib/runcible/extensions/repository.rb', line 347

def regenerate_applicability_by_ids(ids)
  criteria  = {
    'repo_criteria' => { 'filters' => { 'id' => { '$in' => ids } } }
  }
  regenerate_applicability(criteria)
end

#remove_schedules(repo_id, type) ⇒ RestClient::Response

Removes a scheduled sync from a repository

Parameters:

  • repo_id (String)

    the ID of the repository

  • type (String)

    the importer type

Returns:

  • (RestClient::Response)


316
317
318
319
320
321
# File 'lib/runcible/extensions/repository.rb', line 316

def remove_schedules(repo_id, type)
  schedules = Runcible::Resources::RepositorySchedule.new(self.config).list(repo_id, type)
  schedules.each do |schedule|
    Runcible::Resources::RepositorySchedule.new(self.config).delete(repo_id, type, schedule['_id'])
  end
end

#retrieve_with_details(repo_id) ⇒ RestClient::Response

Retrieves a repository with details that include importer and distributors

Parameters:

  • repo_id (String)

    the ID of the repository

Returns:

  • (RestClient::Response)

    the repository with full details



339
340
341
# File 'lib/runcible/extensions/repository.rb', line 339

def retrieve_with_details(repo_id)
  retrieve(repo_id, :details => true)
end

#rpm_ids(id) ⇒ Array<String>

Retrieves the RPM IDs for a single repository

Parameters:

  • id (String)

    the ID of the repository

Returns:

  • (Array<String>)

    the array of repository RPM IDs



129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
# File 'lib/runcible/extensions/repository.rb', line 129

def rpm_ids(id)
  criteria = {:type_ids => [Runcible::Extensions::Rpm.content_type],
              :fields => {:unit => [], :association => ['unit_id']}}
  self.unit_search(id, criteria).map { |i| i['unit_id'] }
rescue RestClient::RequestTimeout
  self.logger.warn('Call to rpm_ids timed out')
  # lazy evaluated iterator from zero to infinite
  pages = Enumerator.new do |y|
    page = 0
    loop do
      y << page
      page += 1
    end
  end

  # TODO: this is hotfix, pagination support should be added to Runcible
  pages.reduce([]) do |rpm_ids, page|
    page_size = 500
    criteria  = { :type_ids => [Runcible::Extensions::Rpm.content_type],
                  :fields   => { :unit => [], :association => ['unit_id'] },
                  :limit    => page_size,
                  :skip     => 0 + page * page_size }
    result    = unit_search(id, criteria).map { |i| i['unit_id'] }
    rpm_ids.concat(result)
    if result.empty? || result.size < 500
      break rpm_ids
    else
      rpm_ids
    end
  end
end

#rpms(id) ⇒ RestClient::Response

Retrieves the RPMs for a single repository

Parameters:

  • id (String)

    the ID of the repository

Returns:

  • (RestClient::Response)

    the set of repository RPMs



165
166
167
168
# File 'lib/runcible/extensions/repository.rb', line 165

def rpms(id)
  criteria = {:type_ids => [Runcible::Extensions::Rpm.content_type]}
  unit_search(id, criteria).map { |i| i['metadata'].with_indifferent_access }
end

#rpms_by_nvre(id, name, version = nil, release = nil, epoch = nil) ⇒ RestClient::Response

Retrieves the RPMs by NVRE for a single repository

Parameters:

  • id (String)

    the ID of the repository

  • name (String)

    the name of the RPMs

  • version (String) (defaults to: nil)

    the version of the RPMs

  • release (String) (defaults to: nil)

    the release of the RPMs

  • epoch (String) (defaults to: nil)

    the epoch of the RPMs

Returns:

  • (RestClient::Response)

    the set of repository RPMs



178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
# File 'lib/runcible/extensions/repository.rb', line 178

def rpms_by_nvre(id, name, version = nil, release = nil, epoch = nil)
  and_condition = []
  and_condition << {:name => name} if name
  and_condition << {:version => version} if version
  and_condition << {:release => release} if release
  and_condition << {:epoch => epoch} if epoch

  criteria = {:type_ids => [Runcible::Extensions::Rpm.content_type],
              :filters => {
                :unit => {
                  '$and' => and_condition
                }
              },
              :sort => {
                :unit => [['name', 'ascending'], ['version', 'descending']]
              }}
  unit_search(id, criteria).map { |p| p['metadata'].with_indifferent_access }
end

#search_by_repository_ids(repository_ids) ⇒ RestClient::Response

Retrieves a set of repositories by their IDs

Parameters:

  • repository_ids (Array)

    the repository ID

Returns:

  • (RestClient::Response)

    the set of repositories requested



117
118
119
120
121
122
# File 'lib/runcible/extensions/repository.rb', line 117

def search_by_repository_ids(repository_ids)
  criteria = {:filters =>
                { 'id' => {'$in' => repository_ids}}
             }
  search(criteria)
end

#sync_status(repo_id) ⇒ RestClient::Response

Retrieves the sync status for a repository

Parameters:

  • repo_id (String)

    the repository ID

Returns:

  • (RestClient::Response)

    a task representing the sync status



101
102
103
# File 'lib/runcible/extensions/repository.rb', line 101

def sync_status(repo_id)
  Runcible::Resources::Task.new(self.config).list(["pulp:repository:#{repo_id}", 'pulp:action:sync'])
end

#update_docker_tags(id, tags) ⇒ RestClient::Response

Updates the docker tags in a repo

Parameters:

  • id (String)

    the ID of the repository

  • tags (Hash)

    for an image in the following format the [=> <image hash>, :tag =>“value”]

Returns:

  • (RestClient::Response)


291
292
293
# File 'lib/runcible/extensions/repository.rb', line 291

def update_docker_tags(id, tags)
  update(id, :scratchpad => {:tags =>  tags})
end