runcible 0.0.7 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -25,5 +25,7 @@ require "runcible/version"
25
25
  require "runcible/base"
26
26
 
27
27
  resources = Dir[File.dirname(__FILE__) + '/runcible/resources/*.rb']
28
+ resources += Dir[File.dirname(__FILE__) + '/runcible/extensions/importer.rb']
29
+ resources += Dir[File.dirname(__FILE__) + '/runcible/extensions/distributor.rb']
28
30
  resources += Dir[File.dirname(__FILE__) + '/runcible/extensions/*.rb']
29
31
  resources.each{ |f| require f }
@@ -53,19 +53,23 @@ module Runcible
53
53
  end
54
54
 
55
55
  def self.call(method, path, options={})
56
- path = config[:api_path] + path
56
+ clone_config = self.config.clone
57
+ path = clone_config[:api_path] + path
57
58
 
58
- RestClient.log = config[:logger] if config[:logger]
59
+ RestClient.log = clone_config[:logger] if clone_config[:logger]
59
60
 
60
- headers = config[:headers]
61
- headers[:params] = options[:params] if options[:params]
61
+ headers = clone_config[:headers].clone
62
62
 
63
- if config[:oauth]
64
- headers = add_oauth_header(method, path, headers) if config[:oauth]
65
- headers["pulp-user"] = config[:user]
66
- client = RestClient::Resource.new(config[:url])
63
+ get_params = options[:params] if options[:params]
64
+ path = combine_get_params(path, get_params) if get_params
65
+
66
+
67
+ if clone_config[:oauth]
68
+ headers = add_oauth_header(method, path, headers) if clone_config[:oauth]
69
+ headers["pulp-user"] = clone_config[:user]
70
+ client = RestClient::Resource.new(clone_config[:url])
67
71
  else
68
- client = RestClient::Resource.new(config[:url], :user => config[:user], :password => config[:http_auth][:password])
72
+ client = RestClient::Resource.new(clone_config[:url], :user => clone_config[:user], :password => config[:http_auth][:password])
69
73
  end
70
74
 
71
75
  args = [method]
@@ -75,6 +79,17 @@ module Runcible
75
79
  process_response(client[path].send(*args))
76
80
  end
77
81
 
82
+ def self.combine_get_params(path, params)
83
+ query_string = params.collect do |k, v|
84
+ if v.is_a? Array
85
+ v.collect{|y| "#{k.to_s}=#{y.to_s}" }.join('&')
86
+ else
87
+ "#{k.to_s}=#{v.to_s}"
88
+ end
89
+ end.flatten().join('&')
90
+ path + "?#{query_string}"
91
+ end
92
+
78
93
  def self.generate_payload(options)
79
94
  if options[:payload]
80
95
  if options[:payload][:optional]
@@ -91,13 +106,20 @@ module Runcible
91
106
  else
92
107
  payload = {}
93
108
  end
94
-
95
109
  return payload.to_json
96
110
  end
97
111
 
98
112
  def self.process_response(response)
99
113
  begin
100
- response = RestClient::Response.create(JSON.parse(response.body), response.net_http_res, response.args)
114
+ body = JSON.parse(response.body)
115
+ if body.respond_to? :with_indifferent_access
116
+ body = body.with_indifferent_access
117
+ elsif body.is_a? Array
118
+ body = body.collect do |i|
119
+ i.respond_to?(:with_indifferent_access) ? i.with_indifferent_access : i
120
+ end
121
+ end
122
+ response = RestClient::Response.create(body, response.net_http_res, response.args)
101
123
  rescue JSON::ParserError
102
124
  end
103
125
 
@@ -0,0 +1,67 @@
1
+ # Copyright (c) 2012
2
+ #
3
+ # MIT License
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining
6
+ # a copy of this software and associated documentation files (the
7
+ # "Software"), to deal in the Software without restriction, including
8
+ # without limitation the rights to use, copy, modify, merge, publish,
9
+ # distribute, sublicense, and/or sell copies of the Software, and to
10
+ # permit persons to whom the Software is furnished to do so, subject to
11
+ # the following conditions:
12
+ #
13
+ # The above copyright notice and this permission notice shall be
14
+ # included in all copies or substantial portions of the Software.
15
+ #
16
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23
+
24
+
25
+ module Runcible
26
+ module Extensions
27
+ class Consumer < Runcible::Resources::Consumer
28
+
29
+ def self.bind_all(id, repo_id)
30
+ # bind the consumer to all repositories with the given repo_id
31
+ Runcible::Extensions::Repository.retrieve(repo_id)['distributors'].each do |d|
32
+ self.bind(id, repo_id, d['id'])
33
+ end
34
+ end
35
+
36
+ def self.unbind_all(id, repo_id)
37
+ # unbind the consumer from all repositories with the given repo_id
38
+ Runcible::Extensions::Repository.retrieve(repo_id)['distributors'].each do |d|
39
+ self.unbind(id, repo_id, d['id'])
40
+ end
41
+ end
42
+
43
+ def self.install(id, type_id, units)
44
+ self.install_content(id, generate_content(type_id, units))
45
+ end
46
+
47
+ def self.update(id, type_id, units)
48
+ self.update_content(id, generate_content(type_id, units))
49
+ end
50
+
51
+ def self.uninstall(id, type_id, units)
52
+ self.uninstall_content(id, generate_content(type_id, units))
53
+ end
54
+
55
+ def self.generate_content(type_id, units)
56
+ content = []
57
+ units.each do |unit|
58
+ content_unit = {}
59
+ content_unit[:type_id] = type_id
60
+ content_unit[:unit_key] = { :name => unit }
61
+ content.push(content_unit)
62
+ end
63
+ content
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,24 @@
1
+ module Runcible
2
+ module Extensions
3
+ class Distribution < Runcible::Base
4
+ TYPE = 'distribution'
5
+
6
+ def self.all()
7
+ Runcible::Resources::Unit.search(TYPE, {})
8
+ end
9
+
10
+ def self.find(id)
11
+ find_all([id]).first
12
+ end
13
+
14
+ def self.find_all(ids)
15
+ Runcible::Resources::Unit.search(TYPE, :filters=> {:id=> {'$in'=> ids}})
16
+ end
17
+
18
+ def self.find_all_by_unit_ids(ids)
19
+ Runcible::Resources::Unit.search(TYPE, :filters=> {:_id=> {'$in'=> ids}})
20
+ end
21
+
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,39 @@
1
+ # Copyright (c) 2012 Justin Sherrill
2
+ #
3
+ # MIT License
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining
6
+ # a copy of this software and associated documentation files (the
7
+ # "Software"), to deal in the Software without restriction, including
8
+ # without limitation the rights to use, copy, modify, merge, publish,
9
+ # distribute, sublicense, and/or sell copies of the Software, and to
10
+ # permit persons to whom the Software is furnished to do so, subject to
11
+ # the following conditions:
12
+ #
13
+ # The above copyright notice and this permission notice shall be
14
+ # included in all copies or substantial portions of the Software.
15
+ #
16
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23
+
24
+ require 'active_support/json'
25
+ require 'securerandom'
26
+
27
+ module Runcible
28
+ module Extensions
29
+ class Distributor
30
+ attr_accessor 'auto_publish', 'id'
31
+
32
+ def initialize(params={})
33
+ @auto_publish = false
34
+ self.id = SecureRandom.hex(10)
35
+ params.each{|k,v| self.send("#{k.to_s}=",v)}
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,24 @@
1
+ module Runcible
2
+ module Extensions
3
+ class Errata < Runcible::Base
4
+ TYPE = 'erratum'
5
+
6
+ def self.all()
7
+ Runcible::Resources::Unit.search(TYPE, {})
8
+ end
9
+
10
+ def self.find(id)
11
+ find_all([id]).first
12
+ end
13
+
14
+ def self.find_all(ids)
15
+ Runcible::Resources::Unit.search(TYPE, :filters=> {:id=> {'$in'=> ids}})
16
+ end
17
+
18
+ def self.find_all_by_unit_ids(ids)
19
+ Runcible::Resources::Unit.search(TYPE, :filters=> {:_id=> {'$in'=> ids}})
20
+ end
21
+
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,38 @@
1
+ # Copyright (c) 2012 Justin Sherrill
2
+ #
3
+ # MIT License
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining
6
+ # a copy of this software and associated documentation files (the
7
+ # "Software"), to deal in the Software without restriction, including
8
+ # without limitation the rights to use, copy, modify, merge, publish,
9
+ # distribute, sublicense, and/or sell copies of the Software, and to
10
+ # permit persons to whom the Software is furnished to do so, subject to
11
+ # the following conditions:
12
+ #
13
+ # The above copyright notice and this permission notice shall be
14
+ # included in all copies or substantial portions of the Software.
15
+ #
16
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23
+
24
+ require 'active_support/core_ext/hash'
25
+ require 'active_support/json'
26
+
27
+
28
+ module Runcible
29
+ module Extensions
30
+ #Importers should supply id & config methods
31
+ class Importer
32
+ def initialize(params={})
33
+ params.each{|k,v| self.send("#{k.to_s}=",v)}
34
+ end
35
+ end
36
+
37
+ end
38
+ end
@@ -0,0 +1,24 @@
1
+ module Runcible
2
+ module Extensions
3
+ class PackageCategory < Runcible::Base
4
+ TYPE = 'package_category'
5
+
6
+ def self.all
7
+ Runcible::Resources::Unit.search(TYPE, {})
8
+ end
9
+
10
+ def self.find(id)
11
+ find_all([id]).first
12
+ end
13
+
14
+ def self.find_all(ids)
15
+ Runcible::Resources::Unit.search(TYPE, :filters => {'id'=> {'$in'=> ids}})
16
+ end
17
+
18
+ def self.find_all_by_unit_ids(ids)
19
+ Runcible::Resources::Unit.search(TYPE, :filters => {:_id=> {'$in'=> ids}})
20
+ end
21
+
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,24 @@
1
+ module Runcible
2
+ module Extensions
3
+ class PackageGroup < Runcible::Base
4
+ TYPE = 'package_group'
5
+
6
+ def self.all
7
+ Runcible::Resources::Unit.search(TYPE, {})
8
+ end
9
+
10
+ def self.find(id)
11
+ find_all([id]).first
12
+ end
13
+
14
+ def self.find_all(ids)
15
+ Runcible::Resources::Unit.search(TYPE, :filters => {'id'=> {'$in'=> ids}})
16
+ end
17
+
18
+ def self.find_all_by_unit_ids(ids)
19
+ Runcible::Resources::Unit.search(TYPE, :filters => {:_id=> {'$in'=> ids}})
20
+ end
21
+
22
+ end
23
+ end
24
+ end
@@ -21,26 +21,42 @@
21
21
  # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
22
  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23
23
 
24
- require 'runcible/resources/repository'
25
-
26
24
 
27
25
  module Runcible
28
- module Pulp
29
- class RepositoryExtension < Runcible::Pulp::Repository
26
+ module Extensions
27
+ class Repository < Runcible::Resources::Repository
30
28
 
31
- def self.create_with_importer(id, importer_type_id, importer_config)
32
- required = required_params(binding.send(:local_variables), binding, ["id"])
33
- create(id, required)
29
+ def self.create_with_importer(id, importer)
30
+ create_with_importer_and_distributors(id, importer)
34
31
  end
35
32
 
36
33
  def self.create_with_distributors(id, distributors)
37
- required = required_params(binding.send(:local_variables), binding, ["id"])
38
- create(id, required)
34
+ create_with_importer_and_distributors(id, nil, distributors)
35
+ end
36
+
37
+ def self.create_with_importer_and_distributors(id, importer, distributors=[], optional={})
38
+ if importer.is_a?(Importer)
39
+ optional[:importer_type_id] = importer.id
40
+ optional[:importer_config] = importer.config
41
+ else
42
+ optional[:importer_type_id] = importer.delete('id') || importer.delete(:id)
43
+ optional[:importer_config] = importer
44
+ end if importer
45
+
46
+ optional[:distributors] = distributors.collect do |d|
47
+ if d.is_a?(Distributor)
48
+ [d.type_id, d.config, d.auto_publish, d.id]
49
+ else
50
+ [d['type_id'], d['config'], d['auto_publish'], d['id']]
51
+ end
52
+ end if !distributors.empty?
53
+ optional[:id] = id
54
+ #debugger
55
+ create(id, optional)
39
56
  end
40
57
 
41
- def self.create_with_importer_and_distributors(id, importer_type_id, importer_config, distributors)
42
- required = required_params(binding.send(:local_variables), binding, ["id"])
43
- create(id, required)
58
+ def self.sync_status(repo_id)
59
+ Runcible::Resources::Task.list(["pulp:repository:#{repo_id}", "pulp:action:sync"])
44
60
  end
45
61
 
46
62
  def self.search_by_repository_ids(repository_ids)
@@ -50,18 +66,161 @@ module Runcible
50
66
  search(criteria)
51
67
  end
52
68
 
53
- def self.rpm_copy(destination_repo_id, source_repo_id, optional={})
69
+ # optional
70
+ # :package_ids
71
+ # :name_blacklist
72
+ def self.rpm_copy(source_repo_id, destination_repo_id, optional={})
73
+
54
74
  criteria = {:type_ids => ['rpm'], :filters => {}}
55
- criteria[:filters]['association'] = {'unit_id' => {'$in' => package_ids}} if optional[:package_ids]
56
- criteria[:filters]['unit'] = { 'name' => {'$not' => {'$in' => name_blacklist}}} if optional[:name_blacklist]
75
+ criteria[:filters]['association'] = {'unit_id' => {'$in' => optional[:package_ids]}} if optional[:package_ids]
76
+ criteria[:filters]['unit'] = { 'name' => {'$not' => {'$in' => optional[:name_blacklist]}}} if optional[:name_blacklist]
57
77
 
78
+ payload = {:criteria=>criteria}
79
+ payload[:override_config] = optional[:override_config] if optional[:override_config]
80
+ unit_copy(destination_repo_id, source_repo_id, payload)
81
+ end
82
+
83
+ def self.rpm_remove(repo_id, package_ids)
84
+ criteria = {:type_ids => ['rpm'], :filters => {}}
85
+ criteria[:filters]['association'] = {'unit_id' => {'$in' => package_ids}}
58
86
  payload = {}
59
87
  payload[:criteria] = criteria
60
- payload[:override_config] = optional[:override_config] if optional[:override_config]
88
+ self.unassociate_units(repo_id, payload)
89
+ end
90
+
91
+ #optional
92
+ # errata_ids
93
+ def self.errata_copy(source_repo_id, destination_repo_id, optional={})
94
+ criteria = {:type_ids => ['erratum'], :filters => {}}
95
+ criteria[:filters][:unit] = { :id=>{ '$in' => optional[:errata_ids] } } if optional[:errata_ids]
96
+ payload = {:criteria => criteria}
97
+ unit_copy(destination_repo_id, source_repo_id, payload)
98
+ end
99
+
100
+ def self.errata_remove(repo_id, errata_ids)
101
+ criteria = {:type_ids => ['erratum'], :filters => {}}
102
+ criteria[:filters][:unit] = { :id=>{ '$in' => errata_ids } }
103
+ payload = {:criteria => criteria}
104
+ self.unassociate_units(repo_id, payload)
105
+ end
61
106
 
107
+ #optoinal
108
+ # distribution_ids
109
+ def self.distribution_copy(source_repo_id, destination_repo_id, optional={})
110
+ criteria = {:type_ids => ['distribution'], :filters => {}}
111
+ criteria[:filters][:unit] = { :id=>{ '$in' => optional[:distribution_ids] } } if optional[:distribution_ids]
112
+ payload = {:criteria => criteria}
62
113
  unit_copy(destination_repo_id, source_repo_id, payload)
63
114
  end
64
115
 
116
+ def self.distribution_remove(repo_id, distribution_id)
117
+ criteria = {:type_ids => ['distribution'], :filters => {}}
118
+ criteria[:filters][:unit] = { :id=>{ '$in' => [distribution_id] } }
119
+ payload = {:criteria => criteria}
120
+ self.unassociate_units(repo_id, payload)
121
+ end
122
+
123
+ def self.rpm_ids(id)
124
+ criteria = {:type_ids=>['rpm'],
125
+ :sort => {
126
+ :unit => [ ['name', 'ascending'], ['version', 'descending'] ]
127
+ }}
128
+ self.unit_search(id, criteria).collect{|i| i['unit_id']}
129
+ end
130
+
131
+ def self.rpms(id)
132
+ criteria = {:type_ids=>['rpm'],
133
+ :sort => {
134
+ :unit => [ ['name', 'ascending'], ['version', 'descending'] ]
135
+ }}
136
+ self.unit_search(id, criteria).collect{|i| i['metadata'].with_indifferent_access}
137
+ end
138
+
139
+ def self.packages_by_nvre(id, name, version=nil, release=nil, epoch=nil)
140
+ and_condition = []
141
+ and_condition << {:name=>name} if name
142
+ and_condition << {:version=>version} if version
143
+ and_condition << {:release=>release} if release
144
+ and_condition << {:epoch=>epoch} if epoch
145
+
146
+ criteria = {:type_ids=>['rpm'],
147
+ :filters => {
148
+ :unit => {
149
+ "$and" => and_condition
150
+ }
151
+ },
152
+ :sort => {
153
+ :unit => [ ['name', 'ascending'], ['version', 'descending'] ]
154
+ }}
155
+ self.unit_search(id, criteria).collect{|p| p['metadata'].with_indifferent_access}
156
+ end
157
+
158
+ def self.errata_ids(id, filter = {})
159
+ criteria = {
160
+ :type_ids=>['erratum'],
161
+ :sort => {
162
+ :unit => [ ['title', 'ascending'] ]
163
+ }
164
+ }
165
+
166
+ self.unit_search(id, criteria).collect{|i| i['unit_id']}
167
+ end
168
+
169
+ def self.distributions(id)
170
+ criteria = {
171
+ :type_ids=>['distribution'],
172
+ :sort => {
173
+ :unit => [ ['id', 'ascending'] ]
174
+ }
175
+ }
176
+
177
+ self.unit_search(id, criteria).collect{|i| i['metadata'].with_indifferent_access}
178
+ end
179
+
180
+ def self.package_groups(id)
181
+ criteria = {
182
+ :type_ids=>[Runcible::Extensions::PackageGroup::TYPE],
183
+ :sort => {
184
+ :unit => [ ['id', 'ascending'] ]
185
+ }
186
+ }
187
+
188
+ self.unit_search(id, criteria).collect{|i| i['metadata'].with_indifferent_access}
189
+ end
190
+
191
+ def self.package_categories(id)
192
+ criteria = {
193
+ :type_ids=>[Runcible::Extensions::PackageCategory::TYPE],
194
+ :sort => {
195
+ :unit => [ ['id', 'ascending'] ]
196
+ }
197
+ }
198
+ self.unit_search(id, criteria).collect{|i| i['metadata'].with_indifferent_access}
199
+ end
200
+
201
+ def self.create_or_update_schedule(repo_id, type, schedule)
202
+ schedules = Runcible::Resources::RepositorySchedule.list(repo_id, type)
203
+ if schedules.empty?
204
+ Runcible::Resources::RepositorySchedule.create(repo_id, type, schedule)
205
+ else
206
+ Runcible::Resources::RepositorySchedule.update(repo_id, type, schedules[0]['_id'], {:schedule=>schedule})
207
+ end
208
+ end
209
+
210
+ def self.remove_schedules(repo_id, type)
211
+ schedules = Runcible::Resources::RepositorySchedule.list(repo_id, type)
212
+ schedules.each do |schedule|
213
+ Runcible::Resources::RepositorySchedule.delete(repo_id, type, schedule['_id'])
214
+ end
215
+ end
216
+
217
+ def self.publish_all(repo_id)
218
+ to_ret = []
219
+ self.retrieve(repo_id)['distributors'].each do |d|
220
+ to_ret << self.publish(repo_id, d['id'])
221
+ end
222
+ to_ret
223
+ end
65
224
  end
66
225
  end
67
226
  end
@@ -0,0 +1,19 @@
1
+ module Runcible
2
+ module Extensions
3
+ class Rpm < Runcible::Base
4
+ TYPE = 'rpm'
5
+
6
+ def self.all
7
+ Runcible::Resources::Unit.search(TYPE, {})
8
+ end
9
+
10
+ def self.find(id)
11
+ find_all([id]).first
12
+ end
13
+
14
+ def self.find_all(ids)
15
+ Runcible::Resources::Unit.search(TYPE, :filters => {'_id'=> {'$in'=> ids}})
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,56 @@
1
+ # Copyright (c) 2012 Justin Sherrill
2
+ #
3
+ # MIT License
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining
6
+ # a copy of this software and associated documentation files (the
7
+ # "Software"), to deal in the Software without restriction, including
8
+ # without limitation the rights to use, copy, modify, merge, publish,
9
+ # distribute, sublicense, and/or sell copies of the Software, and to
10
+ # permit persons to whom the Software is furnished to do so, subject to
11
+ # the following conditions:
12
+ #
13
+ # The above copyright notice and this permission notice shall be
14
+ # included in all copies or substantial portions of the Software.
15
+ #
16
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23
+
24
+ require 'active_support/json'
25
+ require 'securerandom'
26
+
27
+ module Runcible
28
+ module Extensions
29
+ class YumDistributor < Distributor
30
+ #required
31
+ attr_accessor "relative_url", "http", "https"
32
+ #optional
33
+ attr_accessor "protected", "auth_cert", "auth_ca",
34
+ "https_ca", "gpgkey", "generate_metadata",
35
+ "checksum_type", "skip", "https_publish_dir", "http_publish_dir"
36
+
37
+ def initialize(relative_url, http, https, params={})
38
+ @relative_url=relative_url
39
+ @http = http
40
+ @https = https
41
+ super(params)
42
+ end
43
+
44
+ def type_id
45
+ 'yum_distributor'
46
+ end
47
+
48
+ def config
49
+ to_ret = self.as_json
50
+ to_ret.delete('auto_publish')
51
+ to_ret.delete('id')
52
+ to_ret
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,44 @@
1
+ # Copyright (c) 2012 Justin Sherrill
2
+ #
3
+ # MIT License
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining
6
+ # a copy of this software and associated documentation files (the
7
+ # "Software"), to deal in the Software without restriction, including
8
+ # without limitation the rights to use, copy, modify, merge, publish,
9
+ # distribute, sublicense, and/or sell copies of the Software, and to
10
+ # permit persons to whom the Software is furnished to do so, subject to
11
+ # the following conditions:
12
+ #
13
+ # The above copyright notice and this permission notice shall be
14
+ # included in all copies or substantial portions of the Software.
15
+ #
16
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23
+
24
+ module Runcible
25
+ module Extensions
26
+ class YumImporter < Importer
27
+ ID = 'yum_importer'
28
+
29
+ #https://github.com/pulp/pulp/blob/master/rpm-support/plugins/importers/yum_importer/importer.py
30
+ attr_accessor 'feed_url', 'ssl_verify', 'ssl_ca_cert', 'ssl_client_cert', 'ssl_client_key',
31
+ 'proxy_url', 'proxy_port', 'proxy_pass', 'proxy_user',
32
+ 'max_speed', 'verify_size', 'verify_checksum', 'num_threads',
33
+ 'newest', 'remove_old', 'num_old_packages', 'purge_orphaned', 'skip', 'checksum_type',
34
+ 'num_retries', 'retry_delay'
35
+ def id
36
+ YumImporter::ID
37
+ end
38
+
39
+ def config
40
+ self.as_json
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,89 @@
1
+ # Copyright (c) 2012
2
+ #
3
+ # MIT License
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining
6
+ # a copy of this software and associated documentation files (the
7
+ # "Software"), to deal in the Software without restriction, including
8
+ # without limitation the rights to use, copy, modify, merge, publish,
9
+ # distribute, sublicense, and/or sell copies of the Software, and to
10
+ # permit persons to whom the Software is furnished to do so, subject to
11
+ # the following conditions:
12
+ #
13
+ # The above copyright notice and this permission notice shall be
14
+ # included in all copies or substantial portions of the Software.
15
+ #
16
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23
+
24
+
25
+ module Runcible
26
+ module Resources
27
+ class Consumer < Runcible::Base
28
+
29
+ def self.path(id=nil)
30
+ (id == nil) ? "consumers/" : "consumers/#{id}/"
31
+ end
32
+
33
+ def self.create(id, optional={})
34
+ required = required_params(binding.send(:local_variables), binding)
35
+ call(:post, path, :payload => { :required => required, :optional => optional })
36
+ end
37
+
38
+ def self.retrieve(id)
39
+ call(:get, path(id))
40
+ end
41
+
42
+ def self.update(id, optional={})
43
+ required = required_params(binding.send(:local_variables), binding)
44
+ call(:put, path(id), :payload => { :required => required, :optional => optional })
45
+ end
46
+
47
+ def self.upload_profile(id, content_type, profile)
48
+ required = required_params(binding.send(:local_variables), binding, ["id"])
49
+ call(:post, path("#{id}/profiles/"), :payload => { :required => required })
50
+ end
51
+
52
+ def self.profile(id, content_type)
53
+ call(:get, path("#{id}/profiles/#{content_type}/"))
54
+ end
55
+
56
+ def self.delete(id)
57
+ call(:delete, path(id))
58
+ end
59
+
60
+ def self.bind(id, repo_id, distributor_id)
61
+ required = required_params(binding.send(:local_variables), binding, ["id"])
62
+ call(:post, path("#{id}/bindings"), :payload => { :required => required })
63
+ end
64
+
65
+ def self.unbind(id, repo_id, distributor_id)
66
+ call(:delete, path("#{id}/bindings/#{repo_id}/#{distributor_id}"))
67
+ end
68
+
69
+ def self.repos(id)
70
+ call(:get, path("#{id}/bindings/"))
71
+ end
72
+
73
+ def self.install_content(id, units, options="")
74
+ required = required_params(binding.send(:local_variables), binding, ["id"])
75
+ call(:post, path("#{id}/actions/content/install/"), :payload => { :required => required })
76
+ end
77
+
78
+ def self.update_content(id, units, options="")
79
+ required = required_params(binding.send(:local_variables), binding, ["id"])
80
+ call(:post, path("#{id}/actions/content/update/"), :payload => { :required => required })
81
+ end
82
+
83
+ def self.uninstall_content(id, units, options="")
84
+ required = required_params(binding.send(:local_variables), binding, ["id"])
85
+ call(:post, path("#{id}/actions/content/uninstall/"), :payload => { :required => required })
86
+ end
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,36 @@
1
+
2
+ module Runcible
3
+ module Resources
4
+ class EventNotifier < Runcible::Base
5
+
6
+ class EventTypes
7
+ REPO_SYNC_COMPLETE = 'repo-sync-finished'
8
+ REPO_SYNC_START = 'repo-sync-started'
9
+ REPO_PUBLISH_COMPLETE = 'repo-publish-finished'
10
+ REPO_PUBLISH_START = 'repo-publish-started'
11
+ end
12
+
13
+ class NotifierTypes
14
+ REST_API = 'rest-api'
15
+ end
16
+
17
+ def self.create(notifier_type_id, notifier_config, event_types)
18
+ required = required_params(binding.send(:local_variables), binding)
19
+ call(:post, path, :payload => {:required => required})
20
+ end
21
+
22
+ def self.delete(id)
23
+ call(:delete, path(id))
24
+ end
25
+
26
+ def self.list
27
+ call(:get, path)
28
+ end
29
+
30
+ def self.path(id=nil)
31
+ (id == nil) ? "events/" : "events/#{id}/"
32
+ end
33
+ end
34
+ end
35
+ end
36
+
@@ -21,11 +21,10 @@
21
21
  # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
22
  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23
23
 
24
- require 'runcible/base'
25
-
24
+ require 'active_support/core_ext/hash'
26
25
 
27
26
  module Runcible
28
- module Pulp
27
+ module Resources
29
28
  class Repository < Runcible::Base
30
29
 
31
30
  def self.path(id=nil)
@@ -37,8 +36,8 @@ module Runcible
37
36
  call(:post, path, :payload => { :required => required, :optional => optional })
38
37
  end
39
38
 
40
- def self.retrieve(id, params={})
41
- call(:get, path(id), :params => params)
39
+ def self.retrieve(id, details=true)
40
+ call(:get, path(id) + "?details=#{details}")
42
41
  end
43
42
 
44
43
  def self.update(id, optional={})
@@ -72,9 +71,32 @@ module Runcible
72
71
  call(:post, "#{path(id)}actions/sync/", :payload => { :optional => optional })
73
72
  end
74
73
 
75
- def self.unit_copy(destination_repo_id, source_repo_id, optional={})
74
+ def self.sync_history(id)
75
+ call(:get, "#{path(id)}/history/sync/")
76
+ end
77
+
78
+ def self.unit_copy(destination_repo_id, source_repo_id, optional={:criteria=>{}})
76
79
  required = required_params(binding.send(:local_variables), binding, ["destination_repo_id"])
77
- call(:post, "#{path(destination_repo_id)}actions/associate/", :payload => { :required => required, :optional=> optional })
80
+ call(:post, "#{path(destination_repo_id)}actions/associate/",
81
+ :payload => { :required => required, :optional=> optional })
82
+ end
83
+
84
+ def self.unassociate_units(source_repo_id, optional={})
85
+ required = required_params(binding.send(:local_variables), binding, ["source_repo_id"])
86
+ call(:post, "#{path(source_repo_id)}actions/unassociate/",
87
+ :payload => { :required => required, :optional=> optional })
88
+ end
89
+
90
+ def self.unit_search(id, criteria={})
91
+ call(:post, "#{path(id)}search/units/", :payload=>{:required=>{:criteria=>criteria}})
92
+ end
93
+
94
+ def self.publish(repo_id, distributor_id)
95
+ call(:post, "#{path(repo_id)}actions/publish/", :payload=>{:required=>{:id=>distributor_id}})
96
+ end
97
+
98
+ def self.delete_distributor(repo_id, distributor_id)
99
+ call(:delete, "#{path(repo_id)}/distributors/#{distributor_id}/")
78
100
  end
79
101
 
80
102
  end
@@ -0,0 +1,56 @@
1
+ # Copyright (c) 2012 Eric D Helms
2
+ #
3
+ # MIT License
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining
6
+ # a copy of this software and associated documentation files (the
7
+ # "Software"), to deal in the Software without restriction, including
8
+ # without limitation the rights to use, copy, modify, merge, publish,
9
+ # distribute, sublicense, and/or sell copies of the Software, and to
10
+ # permit persons to whom the Software is furnished to do so, subject to
11
+ # the following conditions:
12
+ #
13
+ # The above copyright notice and this permission notice shall be
14
+ # included in all copies or substantial portions of the Software.
15
+ #
16
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23
+
24
+ require 'active_support/core_ext/hash'
25
+
26
+ module Runcible
27
+ module Resources
28
+ class RepositorySchedule < Runcible::Base
29
+
30
+ def self.path(repo_id, importer, schedule_id=nil)
31
+ repo_path = Runcible::Resources::Repository.path(repo_id)
32
+ path = "#{repo_path}importers/#{importer}/sync_schedules/"
33
+ (schedule_id == nil) ? path : "#{path}#{schedule_id}/"
34
+ end
35
+
36
+ def self.list(repo_id, importer_type)
37
+ call(:get, path(repo_id, importer_type))
38
+ end
39
+
40
+ def self.create(repo_id, importer_type, schedule, optional={})
41
+ call(:post, path(repo_id, importer_type),
42
+ :payload => { :required => {:schedule=>schedule}, :optional => optional })
43
+ end
44
+
45
+ # specific call to just update the sync schedule for a repo
46
+ def self.update(repo_id, importer_type, schedule_id, optional={})
47
+ call(:put, path(repo_id, importer_type, schedule_id),
48
+ :payload => {:optional => optional })
49
+ end
50
+
51
+ def self.delete(repo_id, importer_type, schedule_id)
52
+ call(:delete, path(repo_id, importer_type, schedule_id))
53
+ end
54
+ end
55
+ end
56
+ end
@@ -21,11 +21,9 @@
21
21
  # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
22
  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23
23
 
24
- require 'runcible/base'
25
-
26
24
 
27
25
  module Runcible
28
- module Pulp
26
+ module Resources
29
27
  class Role < Runcible::Base
30
28
 
31
29
  def self.path(role=nil)
@@ -21,11 +21,9 @@
21
21
  # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
22
  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23
23
 
24
- require 'runcible/base'
25
-
26
24
 
27
25
  module Runcible
28
- module Pulp
26
+ module Resources
29
27
  class Task < Runcible::Base
30
28
 
31
29
  def self.path(id=nil)
@@ -37,11 +35,19 @@ module Runcible
37
35
  end
38
36
 
39
37
  def self.cancel(id)
40
- call(:delete, path(id))
38
+ #cancelling a task may require cancelling some higher level
39
+ # task, so query the tasks _href field to make sure
40
+ call(:delete, poll(id)['_href'])
41
+ end
42
+
43
+ def self.list(tags=[])
44
+ call(:get, path, :params=>{:tag=>tags})
41
45
  end
42
46
 
43
- def self.list(params={})
44
- call(:get, path, :params => params)
47
+ def self.poll_all(ids)
48
+ # temporary solution until https://bugzilla.redhat.com/show_bug.cgi?id=860089
49
+ # is resolved
50
+ return ids.collect{|id| self.poll(id)}
45
51
  end
46
52
 
47
53
  end
@@ -0,0 +1,17 @@
1
+ module Runcible
2
+ module Resources
3
+ class Unit < Runcible::Base
4
+
5
+ def self.path(type)
6
+ "content/units/#{type}/search/"
7
+ end
8
+
9
+ def self.search(type, criteria)
10
+ call(:post, path(type), :payload=>{:required=>{:criteria=>criteria}})
11
+ end
12
+ end
13
+
14
+
15
+
16
+ end
17
+ end
@@ -23,13 +23,17 @@
23
23
 
24
24
 
25
25
  module Runcible
26
- module Pulp
26
+ module Resources
27
27
  class User < Runcible::Base
28
28
 
29
29
  def self.path(login=nil)
30
30
  (login == nil) ? "users/" : "users/#{login}/"
31
31
  end
32
32
 
33
+ def self.retrieve_all
34
+ call(:get, path)
35
+ end
36
+
33
37
  def self.create(login, optional={})
34
38
  required = required_params(binding.send(:local_variables), binding)
35
39
  call(:post, path, :payload => { :required => required, :optional => optional })
@@ -1,3 +1,3 @@
1
1
  module Runcible
2
- VERSION = "0.0.7"
2
+ VERSION = "0.1.0"
3
3
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: runcible
3
3
  version: !ruby/object:Gem::Version
4
- hash: 17
4
+ hash: 27
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
+ - 1
8
9
  - 0
9
- - 7
10
- version: 0.0.7
10
+ version: 0.1.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Eric D Helms
@@ -15,10 +15,10 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2012-09-14 00:00:00 Z
18
+ date: 2012-10-09 00:00:00 Z
19
19
  dependencies: []
20
20
 
21
- description: ExposingPpulp's juiciest components to the Ruby world.
21
+ description: Exposing Pulp's juiciest components to the Ruby world.
22
22
  email:
23
23
  - ehelms@redhat.com
24
24
  executables: []
@@ -30,12 +30,26 @@ extra_rdoc_files: []
30
30
  files:
31
31
  - lib/runcible.rb
32
32
  - lib/runcible/base.rb
33
+ - lib/runcible/extensions/errata.rb
34
+ - lib/runcible/extensions/importer.rb
35
+ - lib/runcible/extensions/yum_importer.rb
36
+ - lib/runcible/extensions/distributor.rb
37
+ - lib/runcible/extensions/rpm.rb
38
+ - lib/runcible/extensions/package_group.rb
39
+ - lib/runcible/extensions/distribution.rb
40
+ - lib/runcible/extensions/consumer.rb
41
+ - lib/runcible/extensions/yum_distributor.rb
33
42
  - lib/runcible/extensions/repository.rb
43
+ - lib/runcible/extensions/package_category.rb
34
44
  - lib/runcible/version.rb
45
+ - lib/runcible/resources/repository_schedule.rb
46
+ - lib/runcible/resources/event_notifier.rb
35
47
  - lib/runcible/resources/task.rb
48
+ - lib/runcible/resources/consumer.rb
36
49
  - lib/runcible/resources/user.rb
37
50
  - lib/runcible/resources/role.rb
38
51
  - lib/runcible/resources/repository.rb
52
+ - lib/runcible/resources/unit.rb
39
53
  homepage: https://github.com/Katello/runcible
40
54
  licenses: []
41
55