hammer_cli_foreman 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of hammer_cli_foreman might be problematic. Click here for more details.

Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +12 -1
  3. data/doc/configuration.md +13 -0
  4. data/lib/hammer_cli_foreman.rb +3 -0
  5. data/lib/hammer_cli_foreman/architecture.rb +9 -9
  6. data/lib/hammer_cli_foreman/associating_commands.rb +57 -34
  7. data/lib/hammer_cli_foreman/commands.rb +188 -101
  8. data/lib/hammer_cli_foreman/common_parameter.rb +7 -10
  9. data/lib/hammer_cli_foreman/compute_resource.rb +8 -11
  10. data/lib/hammer_cli_foreman/domain.rb +14 -40
  11. data/lib/hammer_cli_foreman/environment.rb +10 -15
  12. data/lib/hammer_cli_foreman/exceptions.rb +4 -0
  13. data/lib/hammer_cli_foreman/fact.rb +5 -5
  14. data/lib/hammer_cli_foreman/host.rb +76 -132
  15. data/lib/hammer_cli_foreman/hostgroup.rb +26 -61
  16. data/lib/hammer_cli_foreman/id_resolver.rb +163 -0
  17. data/lib/hammer_cli_foreman/image.rb +14 -50
  18. data/lib/hammer_cli_foreman/location.rb +35 -17
  19. data/lib/hammer_cli_foreman/media.rb +9 -16
  20. data/lib/hammer_cli_foreman/model.rb +6 -8
  21. data/lib/hammer_cli_foreman/operating_system.rb +129 -63
  22. data/lib/hammer_cli_foreman/organization.rb +36 -16
  23. data/lib/hammer_cli_foreman/output/fields.rb +10 -2
  24. data/lib/hammer_cli_foreman/output/formatters.rb +44 -18
  25. data/lib/hammer_cli_foreman/parameter.rb +45 -41
  26. data/lib/hammer_cli_foreman/partition_table.rb +9 -12
  27. data/lib/hammer_cli_foreman/puppet_class.rb +14 -14
  28. data/lib/hammer_cli_foreman/references.rb +122 -0
  29. data/lib/hammer_cli_foreman/report.rb +3 -6
  30. data/lib/hammer_cli_foreman/searchables_option_builder.rb +99 -0
  31. data/lib/hammer_cli_foreman/smart_class_parameter.rb +17 -13
  32. data/lib/hammer_cli_foreman/smart_proxy.rb +18 -28
  33. data/lib/hammer_cli_foreman/subnet.rb +12 -13
  34. data/lib/hammer_cli_foreman/template.rb +10 -19
  35. data/lib/hammer_cli_foreman/user.rb +9 -28
  36. data/lib/hammer_cli_foreman/version.rb +1 -1
  37. data/locale/hammer-cli-foreman.pot +828 -817
  38. data/test/unit/apipie_resource_mock.rb +33 -11
  39. data/test/unit/architecture_test.rb +7 -10
  40. data/test/unit/commands_test.rb +8 -9
  41. data/test/unit/common_parameter_test.rb +6 -8
  42. data/test/unit/compute_resource_test.rb +9 -12
  43. data/test/unit/data/1.5/foreman_api.json +14130 -0
  44. data/test/unit/domain_test.rb +19 -22
  45. data/test/unit/environment_test.rb +9 -11
  46. data/test/unit/fact_test.rb +5 -6
  47. data/test/unit/helpers/command.rb +115 -59
  48. data/test/unit/helpers/fake_searchables.rb +19 -0
  49. data/test/unit/host_test.rb +44 -33
  50. data/test/unit/hostgroup_test.rb +19 -26
  51. data/test/unit/id_resolver_test.rb +225 -0
  52. data/test/unit/image_test.rb +16 -18
  53. data/test/unit/location_test.rb +8 -10
  54. data/test/unit/media_test.rb +11 -13
  55. data/test/unit/model_test.rb +8 -10
  56. data/test/unit/operating_system_test.rb +23 -23
  57. data/test/unit/organization_test.rb +9 -10
  58. data/test/unit/output/formatters_test.rb +133 -20
  59. data/test/unit/partition_table_test.rb +12 -9
  60. data/test/unit/puppet_class_test.rb +3 -7
  61. data/test/unit/report_test.rb +3 -7
  62. data/test/unit/searchables_option_builder_test.rb +172 -0
  63. data/test/unit/smart_class_parameter_test.rb +5 -7
  64. data/test/unit/smart_proxy_test.rb +11 -12
  65. data/test/unit/subnet_test.rb +15 -16
  66. data/test/unit/template_test.rb +15 -12
  67. data/test/unit/test_helper.rb +1 -1
  68. data/test/unit/user_test.rb +9 -12
  69. metadata +536 -509
@@ -22,39 +22,34 @@ module HammerCLIForeman
22
22
  field :id, _("Id")
23
23
  field :name, _("Name")
24
24
  field :label, _("Label")
25
- field :operatingsystem_id, _("Operating System Id")
26
- field :subnet_id, _("Subnet Id")
27
- field :domain_id, _("Domain Id")
28
- field :architecture_id, _("Architecture Id")
29
- field :ptable_id, _("Partition Table Id")
30
- field :medium_id, _("Medium Id")
31
- field :puppet_ca_proxy_id, _("Puppet CA Proxy Id")
32
- field :puppet_proxy_id, _("Puppet Master Proxy Id")
33
- field :environment_id, _("Environment Id")
34
- field :puppetclass_ids, _("Puppetclass Ids"), Fields::List
25
+ field nil, _("Operating System"), Fields::SingleReference, :key => :operatingsystem
26
+ field nil, _("Environment"), Fields::SingleReference, :key => :environment
27
+ field nil, _("Model"), Fields::SingleReference, :key => :model
35
28
  field :ancestry, _("Ancestry")
36
29
  end
37
30
 
38
- apipie_options
31
+ build_options
39
32
  end
40
33
 
41
34
 
42
35
  class InfoCommand < HammerCLIForeman::InfoCommand
43
36
 
44
- identifiers :id
45
-
46
37
  output ListCommand.output_definition do
47
- collection :parameters, _("Parameters") do
48
- field nil, nil, Fields::KeyValue
49
- end
50
- end
38
+ field nil, _("Subnet"), Fields::SingleReference, :key => :subnet
51
39
 
52
- def extend_data(hostgroup)
53
- hostgroup["parameters"] = HammerCLIForeman::Parameter.get_parameters(resource_config, :hostgroup, hostgroup)
54
- hostgroup
40
+ field nil, _("Domain"), Fields::SingleReference, :key => :domain
41
+ field nil, _("Architecture"), Fields::SingleReference, :key => :architecture
42
+ field nil, _("Partition Table"), Fields::SingleReference, :key => :ptable
43
+ field nil, _("Medium"), Fields::SingleReference, :key => :medium
44
+ field :puppet_ca_proxy_id, _("Puppet CA Proxy Id")
45
+ field :puppet_proxy_id, _("Puppet Master Proxy Id")
46
+ field nil, _("ComputeProfile"), Fields::SingleReference, :key => :compute_profile
47
+ HammerCLIForeman::References.puppetclasses(self)
48
+ HammerCLIForeman::References.parameters(self)
49
+ HammerCLIForeman::References.taxonomies(self)
55
50
  end
56
51
 
57
- apipie_options
52
+ build_options
58
53
  end
59
54
 
60
55
 
@@ -68,103 +63,73 @@ module HammerCLIForeman
68
63
  success_message _("Hostgroup created")
69
64
  failure_message _("Could not create the hostgroup")
70
65
 
71
- apipie_options
66
+ build_options
72
67
  end
73
68
 
74
69
 
75
70
  class UpdateCommand < HammerCLIForeman::UpdateCommand
76
-
77
71
  option "--puppetclass-ids", "PUPPETCLASS_IDS", " ",
78
72
  :format => HammerCLI::Options::Normalizers::List.new
79
73
 
80
74
  include HostgroupUpdateCreateCommons
81
75
 
82
- identifiers :id
83
-
84
76
  success_message _("Hostgroup updated")
85
77
  failure_message _("Could not update the hostgroup")
86
78
 
87
- apipie_options
79
+ build_options
88
80
  end
89
81
 
90
82
 
91
83
  class DeleteCommand < HammerCLIForeman::DeleteCommand
92
-
93
- identifiers :id
94
-
95
84
  success_message _("Hostgroup deleted")
96
85
  failure_message _("Could not delete the hostgroup")
97
86
 
98
- apipie_options
87
+ build_options
99
88
  end
100
89
 
101
90
 
102
91
  class PuppetClassesCommand < HammerCLIForeman::ListCommand
103
-
104
92
  command_name "puppet-classes"
105
93
  resource :puppetclasses
106
94
 
107
- identifiers :id
108
-
109
95
  output HammerCLIForeman::PuppetClass::ListCommand.output_definition
110
96
 
111
- def retrieve_data
97
+ def send_request
112
98
  HammerCLIForeman::PuppetClass::ListCommand.unhash_classes(super)
113
99
  end
114
100
 
115
101
  def request_params
116
102
  params = method_options
117
- params['hostgroup_id'] = get_identifier[0]
103
+ params['hostgroup_id'] = get_identifier
118
104
  params
119
105
  end
120
106
 
121
- apipie_options
107
+ build_options
122
108
  end
123
109
 
124
110
 
125
111
  class SetParameterCommand < HammerCLIForeman::Parameter::SetCommand
126
-
127
- resource :parameters
128
-
129
112
  desc _("Create or update parameter for a hostgroup.")
130
113
 
131
- option "--hostgroup-id", "HOSTGROUP_ID", _("id of the hostgroup the parameter is being set for"), :required => true
132
-
133
114
  success_message_for :update, _("Hostgroup parameter updated")
134
115
  success_message_for :create, _("New hostgroup parameter created")
135
116
  failure_message _("Could not set hostgroup parameter")
136
117
 
137
- def base_action_params
138
- {
139
- "hostgroup_id" => option_hostgroup_id
140
- }
141
- end
118
+ build_options
142
119
  end
143
120
 
144
121
 
145
122
  class DeleteParameterCommand < HammerCLIForeman::Parameter::DeleteCommand
146
-
147
- resource :parameters
148
-
149
123
  desc _("Delete parameter for a hostgroup.")
150
124
 
151
- option "--hostgroup-id", "HOSTGROUP_ID", _("id of the hostgroup the parameter is being deleted for"), :required => true
152
-
153
125
  success_message _("Hostgroup parameter deleted")
154
126
 
155
- def base_action_params
156
- {
157
- "hostgroup_id" => option_hostgroup_id
158
- }
159
- end
127
+ build_options
160
128
  end
161
129
 
162
-
163
130
  class SCParamsCommand < HammerCLIForeman::SmartClassParametersList
164
-
165
- apipie_options :without => [:host_id, :hostgroup_id, :puppetclass_id, :environment_id]
166
- option ['--id', '--name'], 'HOSTGROUP_ID', _('hostgroup id/name'),
167
- :attribute_name => :option_hostgroup_id, :required => true
131
+ parent_resource :hostgroups
132
+ build_options
168
133
  end
169
134
 
170
135
 
@@ -0,0 +1,163 @@
1
+ module HammerCLIForeman
2
+
3
+ class Searchable
4
+
5
+ def initialize(name, description, options={})
6
+ @name = name
7
+ @description = description
8
+ @editable = options[:editable].nil? ? true : options[:editable]
9
+ end
10
+
11
+ attr_reader :name, :description
12
+
13
+ def editable?
14
+ @editable
15
+ end
16
+
17
+ end
18
+
19
+ class Searchables
20
+
21
+ SEARCHABLES = {
22
+ :user => [ Searchable.new("login", _("User's login to search by")) ],
23
+ :template => [],
24
+ :image => [],
25
+ :operatingsystem => []
26
+ }
27
+ DEFAULT_SEARCHABLES = [ Searchable.new("name", _("Name to search by")) ]
28
+
29
+ def for(resource)
30
+ SEARCHABLES[resource.singular_name.to_sym] || DEFAULT_SEARCHABLES
31
+ end
32
+
33
+ end
34
+
35
+ class IdResolver
36
+
37
+ attr_reader :api
38
+
39
+ def initialize(api, searchables)
40
+ @api = api
41
+ @searchables = searchables
42
+ define_id_finders
43
+ end
44
+
45
+ def scoped_options(scope, options)
46
+ prefix = HammerCLI.option_accessor_name("#{scope}_")
47
+ plain_prefix = HammerCLI.option_accessor_name("")
48
+
49
+ scoped_options = options.dup
50
+ options.each do |k, v|
51
+ if k.start_with? prefix
52
+ # remove the scope
53
+ # e.g. option_architecture_id -> option_id
54
+ scoped_options[k.sub(prefix, plain_prefix)] = v
55
+ scoped_options.delete(k)
56
+ end
57
+ end
58
+ scoped_options
59
+ end
60
+
61
+ def dependent_resources(resource, options={})
62
+ options[:required] = (options[:required] == true)
63
+ options[:recursive] = !(options[:recursive] == false)
64
+
65
+ resolve_dependent_resources(resource, [], options)
66
+ end
67
+
68
+ def id_params(action, options={})
69
+ required = !(options[:required] == false)
70
+
71
+ params = action.params.reject{ |p| !(p.name.end_with?("_id")) }
72
+ params = params.reject{ |p| !(p.required?) } if required
73
+ params
74
+ end
75
+
76
+ def param_to_resource(param_name)
77
+ resource_name = param_name.gsub(/_id$/, "")
78
+ resource_name = ApipieBindings::Inflector.pluralize(resource_name.to_s).to_sym
79
+ begin
80
+ @api.resource(resource_name)
81
+ rescue NameError
82
+ nil
83
+ end
84
+ end
85
+
86
+ protected
87
+
88
+ def resolve_dependent_resources(resource, resources_found, options)
89
+ id_params(resource.action(:index), :required => options[:required]).each do |param|
90
+ res = param_to_resource(param.name)
91
+ if res and !resources_found.map(&:name).include?(res.name)
92
+ resources_found << res
93
+ resolve_dependent_resources(res, resources_found, options) if options[:recursive]
94
+ end
95
+ end
96
+ resources_found
97
+ end
98
+
99
+ def define_id_finders
100
+ @api.resources.each do |resource|
101
+ method_name = "#{resource.singular_name}_id"
102
+
103
+ self.class.send(:define_method, method_name) do |options|
104
+ get_id(resource.name, options)
105
+ end unless respond_to?(method_name)
106
+ end
107
+ end
108
+
109
+ def get_id(resource_name, options)
110
+ options[HammerCLI.option_accessor_name("id")] || find_resource(resource_name, options)['id']
111
+ end
112
+
113
+ def find_resource(resource_name, options)
114
+ resource = @api.resource(resource_name)
115
+
116
+ search_options = search_options(options, resource)
117
+ id_params(resource.action(:index), :required => true).each do |param|
118
+ search_options[param.name] ||= send(param.name, scoped_options(param.name.gsub(/_id$/, ""), options))
119
+ end
120
+ resource.action(:index).routes.each do |route|
121
+ route.params_in_path.each do |param|
122
+ key = HammerCLI.option_accessor_name(param.to_s)
123
+ if options[key]
124
+ search_options[param] ||= options[key]
125
+ end
126
+ end
127
+ end
128
+
129
+ results = resource.call(:index, search_options)
130
+ results = HammerCLIForeman.collection_to_common_format(results)
131
+
132
+ pick_result(results, resource)
133
+ end
134
+
135
+ def pick_result(results, resource)
136
+ raise ResolverError.new(_("%s not found") % resource.singular_name) if results.empty?
137
+ raise ResolverError.new(_("%s found more than once") % resource.singular_name) if results.count > 1
138
+ results[0]
139
+ end
140
+
141
+ def search_options(options, resource)
142
+ search_options = create_search_options(options, resource)
143
+ raise MissingSeachOptions.new(_("Missing options to search %s") % resource.singular_name) if search_options.empty?
144
+ search_options
145
+ end
146
+
147
+ def searchables(resource)
148
+ @searchables.for(resource)
149
+ end
150
+
151
+ def create_search_options(options, resource)
152
+ searchables(resource).each do |s|
153
+ value = options[HammerCLI.option_accessor_name(s.name.to_s)]
154
+ if value
155
+ return {:search => "#{s.name} = \"#{value}\""}
156
+ end
157
+ end
158
+ {}
159
+ end
160
+
161
+ end
162
+
163
+ end
@@ -12,12 +12,10 @@ module HammerCLIForeman
12
12
  module ComputeResourceOptions
13
13
 
14
14
  def self.included(base)
15
- base.option "--compute-resource", "COMPUTE_RESOURCE_NAME", _("Compute resource's name")
16
- base.option "--compute-resource-id", "COMPUTE_RESOURCE_ID", _("Compute resource's id")
17
- base.apipie_options :without => [:compute_resource_id, :id]
15
+ base.build_options
18
16
 
19
17
  base.validate_options do
20
- any(:option_compute_resource_id, :option_compute_resource).required
18
+ any(:option_compute_resource_id, :option_compute_resource_name).required
21
19
  end
22
20
  end
23
21
 
@@ -31,39 +29,24 @@ module HammerCLIForeman
31
29
  output do
32
30
  field :id, _("Id")
33
31
  field :name, _("Name")
34
- field :operatingsystem_id, _("Operating System Id"), Fields::Id
32
+ field nil, _("Operating System"), Fields::SingleReference, :key => :operatingsystem
35
33
  field :username, _("Username")
36
34
  field :uuid, _("UUID")
37
35
  end
38
36
 
39
- def request_params
40
- params = super
41
- params['compute_resource_id'] = option_compute_resource_id || option_compute_resource
42
- params
43
- end
44
-
45
37
  end
46
38
 
47
39
 
48
40
  class InfoCommand < HammerCLIForeman::InfoCommand
49
41
 
50
- identifiers :id
51
42
  include HammerCLIForeman::Image::ComputeResourceOptions
52
43
 
53
44
 
54
45
  output ListCommand.output_definition do
55
- field :architecture_id, _("Architecture Id"), Fields::Id
46
+ field nil, _("Architecture"), Fields::SingleReference, :key => :architecture
56
47
  field :iam_role, _("IAM role")
57
- field :created_at, _("Created at"), Fields::Date
58
- field :updated_at, _("Updated at"), Fields::Date
59
- end
60
-
61
- def request_params
62
- params = super
63
- params['compute_resource_id'] = option_compute_resource_id || option_compute_resource
64
- params
48
+ HammerCLIForeman::References.timestamps(self)
65
49
  end
66
-
67
50
  end
68
51
 
69
52
 
@@ -73,19 +56,22 @@ module HammerCLIForeman
73
56
  command_name 'available'
74
57
  desc _("Show images available for addition")
75
58
 
76
- include HammerCLIForeman::Image::ComputeResourceOptions
59
+ option "--compute-resource-id", "ID", " "
60
+ option "--compute-resource", "NAME", " ", :attribute_name => :option_compute_resource_name
77
61
 
78
- output do
79
- field :name, _("Name")
80
- field :uuid, _("UUID")
81
- end
62
+ include HammerCLIForeman::Image::ComputeResourceOptions
82
63
 
83
64
  def request_params
84
65
  params = super
85
- params['id'] = option_compute_resource_id || option_compute_resource
66
+ params['id'] ||= get_identifier
86
67
  params
87
68
  end
88
69
 
70
+ output do
71
+ field :name, _("Name")
72
+ field :uuid, _("UUID")
73
+ end
74
+
89
75
  end
90
76
 
91
77
 
@@ -95,46 +81,24 @@ module HammerCLIForeman
95
81
 
96
82
  success_message _("Image created")
97
83
  failure_message _("Could not create the image")
98
-
99
- def request_params
100
- params = super
101
- params['compute_resource_id'] = option_compute_resource_id || option_compute_resource
102
- params
103
- end
104
84
  end
105
85
 
106
86
 
107
87
  class UpdateCommand < HammerCLIForeman::UpdateCommand
108
88
 
109
- identifiers :id
110
89
  include HammerCLIForeman::Image::ComputeResourceOptions
111
90
 
112
91
  success_message _("Image updated")
113
92
  failure_message _("Could not update the image")
114
-
115
- def request_params
116
- params = super
117
- params['compute_resource_id'] = option_compute_resource_id || option_compute_resource
118
- params
119
- end
120
-
121
93
  end
122
94
 
123
95
 
124
96
  class DeleteCommand < HammerCLIForeman::DeleteCommand
125
97
 
126
- identifiers :id
127
98
  include HammerCLIForeman::Image::ComputeResourceOptions
128
99
 
129
100
  success_message _("Image deleted")
130
101
  failure_message _("Could not delete the image")
131
-
132
- def request_params
133
- params = super
134
- params['compute_resource_id'] = option_compute_resource_id || option_compute_resource
135
- params
136
- end
137
-
138
102
  end
139
103
 
140
104
  autoload_subcommands