pulp 0.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.document +5 -0
- data/.rspec +1 -0
- data/Gemfile +19 -0
- data/Gemfile.lock +42 -0
- data/LICENSE.txt +20 -0
- data/README.rdoc +147 -0
- data/Rakefile +49 -0
- data/VERSION +1 -0
- data/examples/repositories.rb +205 -0
- data/examples/test_pulp.yml +4 -0
- data/lib/pulp.rb +26 -0
- data/lib/pulp/cds.rb +25 -0
- data/lib/pulp/common/debug.rb +37 -0
- data/lib/pulp/common/lifecycle.rb +166 -0
- data/lib/pulp/common/lifecycle/create.rb +16 -0
- data/lib/pulp/common/lifecycle/delete.rb +23 -0
- data/lib/pulp/common/lifecycle/get.rb +22 -0
- data/lib/pulp/common/lifecycle/update.rb +23 -0
- data/lib/pulp/connection/base.rb +84 -0
- data/lib/pulp/connection/handler.rb +59 -0
- data/lib/pulp/consumer.rb +23 -0
- data/lib/pulp/consumergroup.rb +22 -0
- data/lib/pulp/content.rb +14 -0
- data/lib/pulp/distribution.rb +11 -0
- data/lib/pulp/errata.rb +17 -0
- data/lib/pulp/event.rb +8 -0
- data/lib/pulp/filter.rb +19 -0
- data/lib/pulp/package.rb +20 -0
- data/lib/pulp/package_group.rb +8 -0
- data/lib/pulp/package_group_category.rb +7 -0
- data/lib/pulp/repository.rb +114 -0
- data/lib/pulp/service.rb +51 -0
- data/lib/pulp/task.rb +37 -0
- data/lib/pulp/task_history.rb +10 -0
- data/lib/pulp/task_snapshot.rb +9 -0
- data/lib/pulp/user.rb +12 -0
- data/spec/pulp/common/debug_spec.rb +42 -0
- data/spec/pulp/common/lifecycle/create_spec.rb +21 -0
- data/spec/pulp/common/lifecycle/delete_spec.rb +40 -0
- data/spec/pulp/common/lifecycle/get_spec.rb +42 -0
- data/spec/pulp/common/lifecycle/update_spec.rb +48 -0
- data/spec/pulp/common/lifecycle_spec.rb +393 -0
- data/spec/pulp/connection/base_spec.rb +312 -0
- data/spec/pulp/connection/handler_spec.rb +123 -0
- data/spec/pulp/content_spec.rb +21 -0
- data/spec/pulp/package_spec.rb +14 -0
- data/spec/pulp/repository_spec.rb +14 -0
- data/spec/pulp/service_spec.rb +85 -0
- data/spec/pulp/task_spec.rb +48 -0
- data/spec/pulp_spec.rb +4 -0
- data/spec/spec.opts +6 -0
- data/spec/spec_helper.rb +32 -0
- metadata +252 -0
data/lib/pulp.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'rest_client'
|
2
|
+
require 'json'
|
3
|
+
require 'active_support/inflector'
|
4
|
+
|
5
|
+
require 'pulp/common/debug'
|
6
|
+
require 'pulp/common/lifecycle'
|
7
|
+
require 'pulp/common/lifecycle/create'
|
8
|
+
require 'pulp/common/lifecycle/delete'
|
9
|
+
require 'pulp/common/lifecycle/get'
|
10
|
+
require 'pulp/common/lifecycle/update'
|
11
|
+
require 'pulp/connection/base'
|
12
|
+
require 'pulp/connection/handler'
|
13
|
+
|
14
|
+
# types
|
15
|
+
%w{consumer consumergroup content distribution errata event filter task_snapshot task
|
16
|
+
cds package package_group package_group_category repository service task_history user}.each {|type| require "pulp/#{type}" }
|
17
|
+
|
18
|
+
|
19
|
+
if file = [ ENV['PULP_YML'], File.expand_path('~/.pulp.yaml'),'/etc/pulp/pulp.yaml' ].find{|f| f && File.exists?(f) }
|
20
|
+
require 'yaml'
|
21
|
+
global_options = YAML.load_file(file)
|
22
|
+
Pulp::Connection::Handler.hostname = global_options['hostname']
|
23
|
+
Pulp::Connection::Handler.username = global_options['username']
|
24
|
+
Pulp::Connection::Handler.password = global_options['password']
|
25
|
+
Pulp::Connection::Handler.debug_enabled = global_options['debug']||false
|
26
|
+
end
|
data/lib/pulp/cds.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
module Pulp
|
2
|
+
class Cds < Pulp::Connection::Base
|
3
|
+
|
4
|
+
has_crud
|
5
|
+
|
6
|
+
pulp_fields :cluster_id, :description, :hostname, :name, :sync_schedule
|
7
|
+
|
8
|
+
pulp_locked_fields :repo_ids, :last_sync , :secret, :hearbeat
|
9
|
+
|
10
|
+
pulp_action :associate, :params => true, :returns => Pulp::Task
|
11
|
+
pulp_action :unassociate, :params => true, :returns => Pulp::Task
|
12
|
+
|
13
|
+
pulp_action :history, :params => true
|
14
|
+
|
15
|
+
pulp_action :sync, :params => false, :returns => Pulp::Task, :task_list => true
|
16
|
+
|
17
|
+
def history(action)
|
18
|
+
self.class.base_get("history/#{action}/",self.id).collect{|th| Pulp::TaskHistory.new(th) }
|
19
|
+
end
|
20
|
+
|
21
|
+
def repositories
|
22
|
+
repo_ids.collect{|repo_id| Pulp::Repository.find_by_id(repo_id).first }.compact
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Pulp
|
2
|
+
module Common
|
3
|
+
module Debug
|
4
|
+
def self.included(base)
|
5
|
+
base.extend(ClassMethods)
|
6
|
+
end
|
7
|
+
|
8
|
+
def debug(msg)
|
9
|
+
self.class.debug(msg)
|
10
|
+
end
|
11
|
+
|
12
|
+
module ClassMethods
|
13
|
+
def debug_enabled
|
14
|
+
@debug_enabled ||= false
|
15
|
+
end
|
16
|
+
|
17
|
+
def debug_enabled=(enable)
|
18
|
+
@debug_enabled = enable
|
19
|
+
self.output = self.output # reset output to activate it
|
20
|
+
end
|
21
|
+
|
22
|
+
def output=(o)
|
23
|
+
@output = o
|
24
|
+
RestClient.log = debug_enabled ? output : nil
|
25
|
+
end
|
26
|
+
|
27
|
+
def output
|
28
|
+
@output ||= STDERR
|
29
|
+
end
|
30
|
+
|
31
|
+
def debug(msg)
|
32
|
+
output.puts msg if @debug_enabled
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,166 @@
|
|
1
|
+
module Pulp
|
2
|
+
module Common
|
3
|
+
module Lifecycle
|
4
|
+
def self.included(base)
|
5
|
+
base.extend ClassMethods
|
6
|
+
end
|
7
|
+
def fields
|
8
|
+
@fields ||= {}
|
9
|
+
end
|
10
|
+
|
11
|
+
def user_fields
|
12
|
+
@user_fields ||= {}
|
13
|
+
end
|
14
|
+
def record_fields
|
15
|
+
self.class.record_fields
|
16
|
+
end
|
17
|
+
def special_fields
|
18
|
+
self.class.special_fields
|
19
|
+
end
|
20
|
+
|
21
|
+
def locked_fields
|
22
|
+
self.class.locked_fields
|
23
|
+
end
|
24
|
+
|
25
|
+
module ClassMethods
|
26
|
+
# Allows for dynamically declaring fields that will come from
|
27
|
+
# Pulp.
|
28
|
+
#
|
29
|
+
def pulp_field(field,options={})
|
30
|
+
locked_fields << field if options[:locked]
|
31
|
+
|
32
|
+
module_eval("def #{field}() user_fields['#{field}'] || fields['#{field}']; end")
|
33
|
+
module_eval("def #{field}=(val) user_fields['#{field}'] = val; end") unless options[:locked]
|
34
|
+
|
35
|
+
record_fields[field] = options
|
36
|
+
end
|
37
|
+
|
38
|
+
# Declare many fields at once.
|
39
|
+
def pulp_fields(*fields)
|
40
|
+
fields.to_a.each {|field| pulp_field(field) }
|
41
|
+
end
|
42
|
+
|
43
|
+
def pulp_deferred_field(field,options={})
|
44
|
+
if options[:array]
|
45
|
+
module_eval("def #{field}() self.class.plain_get(fields['#{field}']).collect{|p| #{options[:array]}.new(p) }; end")
|
46
|
+
elsif options[:returns] == :plain
|
47
|
+
module_eval("def #{field}() self.class.plain_base.connection[fields['#{field}'].sub(/^\\/pulp\\/api\\//,'')].get; end")
|
48
|
+
elsif options[:returns]
|
49
|
+
module_eval("def #{field}() (res = self.class.plain_get(fields['#{field}'])).empty? ? nil : #{options[:returns]}.new(res); end")
|
50
|
+
else
|
51
|
+
module_eval("def #{field}() self.class.plain_get(fields['#{field}']); end")
|
52
|
+
end
|
53
|
+
module_eval("def #{field}_link() fields['#{field}']; end")
|
54
|
+
end
|
55
|
+
|
56
|
+
# Declare many deffered fields at once.
|
57
|
+
def pulp_deferred_fields(*fields)
|
58
|
+
[*fields].each {|field| pulp_deferred_field(field) }
|
59
|
+
end
|
60
|
+
|
61
|
+
# declare a field that is locked
|
62
|
+
def pulp_locked_field(field,options={})
|
63
|
+
pulp_field field, options.merge(:locked => true)
|
64
|
+
end
|
65
|
+
|
66
|
+
# Declare many locked fields at once.
|
67
|
+
def pulp_locked_fields(*fields)
|
68
|
+
[*fields].each {|field| pulp_locked_field(field) }
|
69
|
+
end
|
70
|
+
|
71
|
+
# special fields are locked and registered as being special
|
72
|
+
def pulp_special_field(field,options={})
|
73
|
+
pulp_locked_field(field,options)
|
74
|
+
special_fields << field
|
75
|
+
end
|
76
|
+
|
77
|
+
#Declare multiple special fields at once
|
78
|
+
def pulp_special_fields(*fields)
|
79
|
+
[*fields].each{|f| pulp_special_field(f) }
|
80
|
+
end
|
81
|
+
|
82
|
+
# optional features
|
83
|
+
def has_collection(options={})
|
84
|
+
|
85
|
+
instance_eval %{ def all
|
86
|
+
base_get('').collect {|e| self.new(e) }
|
87
|
+
end}
|
88
|
+
|
89
|
+
options[:all_filters] && options[:all_filters].each do |filter|
|
90
|
+
instance_eval %{
|
91
|
+
def find_by_#{filter}(f)
|
92
|
+
base_get('',nil,{ :#{filter} => f }).collect {|e| self.new(e) }
|
93
|
+
end}
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def has_crud(options={})
|
98
|
+
has_collection(options[:collection]||{})
|
99
|
+
has_create
|
100
|
+
has_get
|
101
|
+
has_update
|
102
|
+
has_delete
|
103
|
+
end
|
104
|
+
|
105
|
+
def has_delete
|
106
|
+
include Pulp::Common::Lifecycle::Delete
|
107
|
+
end
|
108
|
+
|
109
|
+
def has_create
|
110
|
+
include Pulp::Common::Lifecycle::Create
|
111
|
+
end
|
112
|
+
|
113
|
+
def has_get
|
114
|
+
include Pulp::Common::Lifecycle::Get
|
115
|
+
end
|
116
|
+
|
117
|
+
def has_update
|
118
|
+
include Pulp::Common::Lifecycle::Update
|
119
|
+
end
|
120
|
+
|
121
|
+
def pulp_action(action_name, options={})
|
122
|
+
options[:method] ||= :post
|
123
|
+
options[:params] = true if options[:params].nil?
|
124
|
+
# default is true
|
125
|
+
slash = (options[:append_slash].nil? || options[:append_slash]) ? '/' : ''
|
126
|
+
if options[:returns]
|
127
|
+
module_eval %{
|
128
|
+
def #{action_name}(#{"params#{"={}" if options[:params] == :optional}" if options[:params]})
|
129
|
+
#{options[:returns]}.new(self.class.base_#{(options[:parse] == false) ? 'unparsed_' : '' }#{options[:method]}('#{action_name}#{slash}',self.id,#{options[:params] ? 'params' : 'nil' }))
|
130
|
+
end}
|
131
|
+
else
|
132
|
+
module_eval %{
|
133
|
+
def #{action_name}(#{"params#{"={}" if options[:params] == :optional}" if options[:params]})
|
134
|
+
self.class.base_#{(options[:parse] == false) ? 'unparsed_' : '' }#{options[:method]}('#{action_name}#{slash}',self.id,#{options[:params] ? 'params' : 'nil' })
|
135
|
+
end}
|
136
|
+
end
|
137
|
+
if options[:task_list]
|
138
|
+
module_eval %{
|
139
|
+
def #{action_name}_tasks
|
140
|
+
self.class.base_get('#{action_name}#{slash}',self.id).collect{|p| Pulp::Task.new(p) }
|
141
|
+
end}
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
def pulp_update_action(action_name,options)
|
146
|
+
module_eval %{
|
147
|
+
def update_#{action_name}(#{[*options[:params]].join(', ')})
|
148
|
+
self.class.base_put('',self.id,{ #{[*options[:params]].collect{|p| ":#{p} => #{p}" }.join(', ')} })
|
149
|
+
end}
|
150
|
+
end
|
151
|
+
|
152
|
+
def special_fields
|
153
|
+
@special_fields ||= []
|
154
|
+
end
|
155
|
+
|
156
|
+
def record_fields
|
157
|
+
@record_fields ||= {}
|
158
|
+
end
|
159
|
+
|
160
|
+
def locked_fields
|
161
|
+
@locked_fields ||= []
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Pulp
|
2
|
+
module Common
|
3
|
+
module Lifecycle
|
4
|
+
module Delete
|
5
|
+
def self.included(base)
|
6
|
+
base.extend ClassMethods
|
7
|
+
end
|
8
|
+
def delete
|
9
|
+
self.class.delete(id)
|
10
|
+
end
|
11
|
+
module ClassMethods
|
12
|
+
def delete_all
|
13
|
+
base_unparsed_delete('','')
|
14
|
+
end
|
15
|
+
|
16
|
+
def delete(item_id)
|
17
|
+
base_delete("",item_id)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Pulp
|
2
|
+
module Common
|
3
|
+
module Lifecycle
|
4
|
+
module Get
|
5
|
+
def self.included(base)
|
6
|
+
base.extend ClassMethods
|
7
|
+
end
|
8
|
+
|
9
|
+
def refresh
|
10
|
+
set_fields(self.class.base_get('',id))
|
11
|
+
self
|
12
|
+
end
|
13
|
+
|
14
|
+
module ClassMethods
|
15
|
+
def get(item_id)
|
16
|
+
self.new(base_get('',item_id))
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Pulp
|
2
|
+
module Common
|
3
|
+
module Lifecycle
|
4
|
+
module Update
|
5
|
+
def self.included(base)
|
6
|
+
base.extend ClassMethods
|
7
|
+
end
|
8
|
+
|
9
|
+
def save
|
10
|
+
res = self.class.update(self.id,user_fields.reject{|key,value| self.class.special_fields.include?(key) })
|
11
|
+
refresh if self.respond_to?(:refresh)
|
12
|
+
res
|
13
|
+
end
|
14
|
+
|
15
|
+
module ClassMethods
|
16
|
+
def update(item,fields)
|
17
|
+
self.new(base_put('',item,fields))
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
module Pulp
|
2
|
+
module Connection
|
3
|
+
class Base
|
4
|
+
include Pulp::Common::Lifecycle
|
5
|
+
|
6
|
+
pulp_special_fields :_id, :id
|
7
|
+
|
8
|
+
def initialize(data={})
|
9
|
+
set_fields(data)
|
10
|
+
end
|
11
|
+
|
12
|
+
def set_fields(field_data)
|
13
|
+
@fields = field_data
|
14
|
+
end
|
15
|
+
|
16
|
+
class << self
|
17
|
+
attr_accessor :hostname, :username, :password, :https
|
18
|
+
|
19
|
+
def reset
|
20
|
+
Pulp::Connection::Handler.reset_instance(self.identifier)
|
21
|
+
end
|
22
|
+
|
23
|
+
def identifier
|
24
|
+
@identifier ||= name.demodulize.downcase
|
25
|
+
end
|
26
|
+
|
27
|
+
def plain_unparsed_get(cmd, params=nil)
|
28
|
+
plain_base.connection[cmd.sub(/^#{Regexp.escape(plain_base.api_path)}\//,'')].get(merge_params(params)).body
|
29
|
+
end
|
30
|
+
|
31
|
+
def base_unparsed_get(cmd,item=nil,params=nil)
|
32
|
+
base.connection[parse_item_cmd(item,cmd)].get(merge_params(params)).body
|
33
|
+
end
|
34
|
+
|
35
|
+
def base_unparsed_delete(cmd,item=nil,params=nil)
|
36
|
+
base.connection[parse_item_cmd(item,cmd)].delete(merge_params(params)).body
|
37
|
+
end
|
38
|
+
|
39
|
+
def base_unparsed_post(cmd,item=nil,params=nil)
|
40
|
+
base.connection[parse_item_cmd(item,cmd)].post(params.nil? ? nil : params.to_json, :content_type => :json ).body
|
41
|
+
end
|
42
|
+
|
43
|
+
def base_unparsed_put(cmd,item=nil,params=nil)
|
44
|
+
base.connection[parse_item_cmd(item,cmd)].put(params.nil? ? nil : params.to_json, :content_type => :json ).body
|
45
|
+
end
|
46
|
+
|
47
|
+
def plain_get(cmd, params=nil)
|
48
|
+
plain_base.parsed{|conn| conn[cmd.sub(/^#{Regexp.escape(plain_base.api_path)}\//,'')].get(merge_params(params)) }
|
49
|
+
end
|
50
|
+
|
51
|
+
def base_get(cmd,item=nil,params=nil)
|
52
|
+
base.parsed{|conn| conn[parse_item_cmd(item,cmd)].get(merge_params(params)) }
|
53
|
+
end
|
54
|
+
|
55
|
+
def base_delete(cmd,item=nil,params=nil)
|
56
|
+
base.parsed{|conn| conn[parse_item_cmd(item,cmd)].delete(merge_params(params)) }
|
57
|
+
end
|
58
|
+
|
59
|
+
def base_post(cmd,item=nil,params=nil)
|
60
|
+
base.parsed{|conn| conn[parse_item_cmd(item,cmd)].post(params.nil? ? nil : params.to_json, :content_type => :json ) }
|
61
|
+
end
|
62
|
+
def base_put(cmd,item=nil,params=nil)
|
63
|
+
base.parsed{|conn| conn[parse_item_cmd(item,cmd)].put(params.nil? ? nil : params.to_json, :content_type => :json ) }
|
64
|
+
end
|
65
|
+
|
66
|
+
def base
|
67
|
+
Pulp::Connection::Handler.instance_for(self.identifier, hostname, username, password, (https.nil? ? true : https))
|
68
|
+
end
|
69
|
+
|
70
|
+
def plain_base
|
71
|
+
Pulp::Connection::Handler.instance_for('', hostname, username, password, (https.nil? ? true : https))
|
72
|
+
end
|
73
|
+
|
74
|
+
def parse_item_cmd(item,cmd)
|
75
|
+
"#{"/#{item}" unless item.nil?}#{(cmd =~ /^\//) ? cmd : "/#{cmd}"}"
|
76
|
+
end
|
77
|
+
|
78
|
+
def merge_params(params)
|
79
|
+
params.nil? ? {} : { :params => params }
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
module Pulp
|
2
|
+
module Connection
|
3
|
+
class Handler
|
4
|
+
|
5
|
+
include Pulp::Common::Debug
|
6
|
+
|
7
|
+
class << self
|
8
|
+
attr_accessor :hostname,:username, :password
|
9
|
+
|
10
|
+
def instance_for(identifier,h=nil,u=nil,p=nil,https=true)
|
11
|
+
instances[identifier] ||= Handler.new(identifier,
|
12
|
+
h||hostname,
|
13
|
+
u||username,
|
14
|
+
p||password,
|
15
|
+
https
|
16
|
+
)
|
17
|
+
end
|
18
|
+
|
19
|
+
def reset_instance(identifier)
|
20
|
+
instances.delete(identifier)
|
21
|
+
end
|
22
|
+
|
23
|
+
def reset_all
|
24
|
+
@instances = {}
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
def instances
|
29
|
+
@instances ||= {}
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def initialize(identifier,hostname,username=nil,password=nil,https=true)
|
34
|
+
@identifier = identifier
|
35
|
+
@hostname = hostname
|
36
|
+
@username = username
|
37
|
+
@password = password
|
38
|
+
@https = https
|
39
|
+
end
|
40
|
+
|
41
|
+
def parsed
|
42
|
+
JSON.parse((yield self.connection).body)
|
43
|
+
end
|
44
|
+
|
45
|
+
def connection
|
46
|
+
@connection ||= RestClient::Resource.new(url, :user => @username, :password => @password, :headers => { :accept => :json })
|
47
|
+
end
|
48
|
+
|
49
|
+
def api_path
|
50
|
+
"/pulp/api"
|
51
|
+
end
|
52
|
+
|
53
|
+
def url
|
54
|
+
@url ||= "#{@https ? 'https' : 'http'}://#{@hostname}#{api_path}/#{@identifier.to_s.pluralize}"
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|