hammer_cli_foreman 0.1.0 → 0.1.1

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.

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