hammer_cli_foreman 0.1.1 → 0.1.2
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.
- checksums.yaml +4 -4
- data/README.md +11 -3
- data/doc/developer_docs.md +13 -0
- data/doc/name_id_resolution.md +50 -0
- data/doc/option_builder.md +48 -0
- data/doc/release_notes.md +64 -0
- data/lib/hammer_cli_foreman.rb +100 -23
- data/lib/hammer_cli_foreman/architecture.rb +0 -1
- data/lib/hammer_cli_foreman/associating_commands.rb +71 -0
- data/lib/hammer_cli_foreman/auth.rb +0 -1
- data/lib/hammer_cli_foreman/commands.rb +112 -80
- data/lib/hammer_cli_foreman/common_parameter.rb +5 -3
- data/lib/hammer_cli_foreman/compute_resource.rb +0 -2
- data/lib/hammer_cli_foreman/dependency_resolver.rb +32 -0
- data/lib/hammer_cli_foreman/domain.rb +0 -1
- data/lib/hammer_cli_foreman/environment.rb +0 -2
- data/lib/hammer_cli_foreman/exception_handler.rb +3 -3
- data/lib/hammer_cli_foreman/fact.rb +1 -1
- data/lib/hammer_cli_foreman/filter.rb +102 -0
- data/lib/hammer_cli_foreman/host.rb +5 -7
- data/lib/hammer_cli_foreman/hostgroup.rb +4 -3
- data/lib/hammer_cli_foreman/id_resolver.rb +60 -51
- data/lib/hammer_cli_foreman/image.rb +0 -1
- data/lib/hammer_cli_foreman/location.rb +7 -3
- data/lib/hammer_cli_foreman/media.rb +1 -1
- data/lib/hammer_cli_foreman/model.rb +1 -1
- data/lib/hammer_cli_foreman/operating_system.rb +4 -6
- data/lib/hammer_cli_foreman/option_builders.rb +285 -0
- data/lib/hammer_cli_foreman/organization.rb +7 -3
- data/lib/hammer_cli_foreman/param_filters.rb +61 -0
- data/lib/hammer_cli_foreman/parameter.rb +5 -3
- data/lib/hammer_cli_foreman/partition_table.rb +1 -1
- data/lib/hammer_cli_foreman/puppet_class.rb +1 -1
- data/lib/hammer_cli_foreman/references.rb +16 -0
- data/lib/hammer_cli_foreman/report.rb +1 -1
- data/lib/hammer_cli_foreman/role.rb +78 -0
- data/lib/hammer_cli_foreman/smart_class_parameter.rb +1 -1
- data/lib/hammer_cli_foreman/smart_proxy.rb +17 -2
- data/lib/hammer_cli_foreman/smart_variables.rb +111 -0
- data/lib/hammer_cli_foreman/subnet.rb +1 -1
- data/lib/hammer_cli_foreman/template.rb +10 -4
- data/lib/hammer_cli_foreman/user.rb +5 -1
- data/lib/hammer_cli_foreman/usergroup.rb +58 -0
- data/lib/hammer_cli_foreman/version.rb +1 -1
- data/locale/Makefile +12 -11
- data/locale/README.md +18 -0
- data/locale/en/LC_MESSAGES/hammer-cli-foreman.mo +0 -0
- data/locale/en/hammer-cli-foreman.po +1584 -0
- data/locale/en_GB/LC_MESSAGES/hammer-cli-foreman.mo +0 -0
- data/locale/en_GB/hammer-cli-foreman.po +1975 -0
- data/locale/es/LC_MESSAGES/hammer-cli-foreman.mo +0 -0
- data/locale/es/hammer-cli-foreman.po +1976 -0
- data/locale/fr/LC_MESSAGES/hammer-cli-foreman.mo +0 -0
- data/locale/fr/hammer-cli-foreman.po +1976 -0
- data/locale/hammer-cli-foreman.pot +1197 -787
- data/test/unit/api_test.rb +25 -0
- data/test/unit/architecture_test.rb +1 -0
- data/test/unit/commands_test.rb +18 -0
- data/test/unit/common_parameter_test.rb +1 -0
- data/test/unit/compute_resource_test.rb +1 -0
- data/test/unit/data/1.6/foreman_api.json +1 -0
- data/test/unit/dependency_resolver_test.rb +42 -0
- data/test/unit/domain_test.rb +1 -0
- data/test/unit/environment_test.rb +1 -0
- data/test/unit/fact_test.rb +1 -0
- data/test/unit/filter_test.rb +133 -0
- data/test/unit/helpers/command.rb +0 -13
- data/test/unit/host_test.rb +3 -0
- data/test/unit/hostgroup_test.rb +1 -0
- data/test/unit/id_resolver_test.rb +21 -68
- data/test/unit/image_test.rb +1 -1
- data/test/unit/location_test.rb +2 -0
- data/test/unit/media_test.rb +2 -0
- data/test/unit/model_test.rb +1 -0
- data/test/unit/operating_system_test.rb +1 -0
- data/test/unit/option_builders_test.rb +543 -0
- data/test/unit/organization_test.rb +1 -0
- data/test/unit/param_filters_test.rb +143 -0
- data/test/unit/partition_table_test.rb +1 -0
- data/test/unit/puppet_class_test.rb +1 -0
- data/test/unit/report_test.rb +1 -0
- data/test/unit/role_test.rb +94 -0
- data/test/unit/smart_class_parameter_test.rb +1 -0
- data/test/unit/smart_proxy_test.rb +14 -1
- data/test/unit/subnet_test.rb +1 -0
- data/test/unit/template_test.rb +1 -0
- data/test/unit/test_helper.rb +1 -1
- data/test/unit/user_test.rb +1 -0
- data/test/unit/usergroup_test.rb +80 -0
- metadata +50 -7
- data/lib/hammer_cli_foreman/searchables_option_builder.rb +0 -99
- data/test/unit/searchables_option_builder_test.rb +0 -172
|
@@ -149,7 +149,7 @@ module HammerCLIForeman
|
|
|
149
149
|
end
|
|
150
150
|
|
|
151
151
|
def get_parameters(host_id)
|
|
152
|
-
params = HammerCLIForeman.foreman_resource(:parameters).call(:index, :host_id => host_id)
|
|
152
|
+
params = HammerCLIForeman.foreman_resource!(:parameters).call(:index, :host_id => host_id)
|
|
153
153
|
HammerCLIForeman.collection_to_common_format(params)
|
|
154
154
|
end
|
|
155
155
|
|
|
@@ -323,7 +323,7 @@ module HammerCLIForeman
|
|
|
323
323
|
|
|
324
324
|
def validate_options
|
|
325
325
|
super
|
|
326
|
-
unless validator.
|
|
326
|
+
unless validator.any(:option_hostgroup_id, :option_hostgroup_name).exist?
|
|
327
327
|
if option_managed
|
|
328
328
|
validator.all(:option_environment_id, :option_architecture_id, :option_domain_id,
|
|
329
329
|
:option_puppet_proxy_id, :option_operatingsystem_id,
|
|
@@ -395,7 +395,7 @@ module HammerCLIForeman
|
|
|
395
395
|
end
|
|
396
396
|
|
|
397
397
|
def request_params
|
|
398
|
-
params =
|
|
398
|
+
params = super
|
|
399
399
|
params['id'] = get_identifier
|
|
400
400
|
params
|
|
401
401
|
end
|
|
@@ -429,7 +429,7 @@ module HammerCLIForeman
|
|
|
429
429
|
end
|
|
430
430
|
|
|
431
431
|
def request_params
|
|
432
|
-
params =
|
|
432
|
+
params = super
|
|
433
433
|
params['id'] = get_identifier
|
|
434
434
|
params
|
|
435
435
|
end
|
|
@@ -449,7 +449,7 @@ module HammerCLIForeman
|
|
|
449
449
|
end
|
|
450
450
|
|
|
451
451
|
def request_params
|
|
452
|
-
params =
|
|
452
|
+
params = super
|
|
453
453
|
params['id'] = get_identifier
|
|
454
454
|
params
|
|
455
455
|
end
|
|
@@ -466,5 +466,3 @@ module HammerCLIForeman
|
|
|
466
466
|
end
|
|
467
467
|
|
|
468
468
|
end
|
|
469
|
-
|
|
470
|
-
HammerCLI::MainCommand.subcommand 'host', ("Manipulate hosts."), HammerCLIForeman::Host
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
require 'hammer_cli_foreman/smart_class_parameter'
|
|
2
|
+
require 'hammer_cli_foreman/puppet_class'
|
|
2
3
|
|
|
3
4
|
module HammerCLIForeman
|
|
4
5
|
|
|
5
6
|
module HostgroupUpdateCreateCommons
|
|
6
7
|
|
|
7
8
|
def request_params
|
|
8
|
-
params =
|
|
9
|
+
params = super
|
|
9
10
|
params['hostgroup']['puppetclass_ids'] = option_puppetclass_ids
|
|
10
11
|
params
|
|
11
12
|
end
|
|
@@ -99,7 +100,7 @@ module HammerCLIForeman
|
|
|
99
100
|
end
|
|
100
101
|
|
|
101
102
|
def request_params
|
|
102
|
-
params =
|
|
103
|
+
params = super
|
|
103
104
|
params['hostgroup_id'] = get_identifier
|
|
104
105
|
params
|
|
105
106
|
end
|
|
@@ -138,4 +139,4 @@ module HammerCLIForeman
|
|
|
138
139
|
|
|
139
140
|
end
|
|
140
141
|
|
|
141
|
-
|
|
142
|
+
|
|
@@ -18,13 +18,45 @@ module HammerCLIForeman
|
|
|
18
18
|
|
|
19
19
|
class Searchables
|
|
20
20
|
|
|
21
|
+
protected
|
|
22
|
+
|
|
23
|
+
def self.s(name, description, options={})
|
|
24
|
+
Searchable.new(name, description, options)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def self.s_name(description, options={})
|
|
28
|
+
s("name", description, options)
|
|
29
|
+
end
|
|
30
|
+
|
|
21
31
|
SEARCHABLES = {
|
|
22
|
-
:
|
|
23
|
-
:
|
|
24
|
-
:
|
|
25
|
-
:
|
|
32
|
+
:architecture => [ s_name(_("Architecture name")) ],
|
|
33
|
+
:compute_resource => [ s_name(_("Compute resource name")) ],
|
|
34
|
+
:domain => [ s_name(_("Domain name")) ],
|
|
35
|
+
:environment => [ s_name(_("Environment name")) ],
|
|
36
|
+
:fact_value => [],
|
|
37
|
+
:filter => [],
|
|
38
|
+
:host => [ s_name(_("Host name")) ],
|
|
39
|
+
:hostgroup => [ s_name(_("Hostgroup name")) ],
|
|
40
|
+
:image => [],
|
|
41
|
+
:location => [ s_name(_("Location name")) ],
|
|
42
|
+
:medium => [ s_name(_("Medium name")) ],
|
|
43
|
+
:model => [ s_name(_("Model name")) ],
|
|
44
|
+
:organization => [ s_name(_("Organization name")) ],
|
|
45
|
+
:operatingsystem => [],
|
|
46
|
+
:ptable => [ s_name(_("Partition table name")) ],
|
|
47
|
+
:proxy => [ s_name(_("Proxy name")) ],
|
|
48
|
+
:puppetclass => [ s_name(_("Puppet class name")) ],
|
|
49
|
+
:report => [ s_name(_("Report name")) ],
|
|
50
|
+
:role => [ s_name(_("User role name")) ],
|
|
51
|
+
:subnet => [ s_name(_("Subnet name")) ],
|
|
52
|
+
:template => [],
|
|
53
|
+
:user => [ s("login", _("User's login to search by")) ],
|
|
54
|
+
:common_parameter => [ s_name(_("Common parameter name")) ],
|
|
55
|
+
:smart_class_parameter => [ s_name(_("Smart class parameter name")) ]
|
|
26
56
|
}
|
|
27
|
-
DEFAULT_SEARCHABLES = [
|
|
57
|
+
DEFAULT_SEARCHABLES = [ s_name(_("Name to search by")) ]
|
|
58
|
+
|
|
59
|
+
public
|
|
28
60
|
|
|
29
61
|
def for(resource)
|
|
30
62
|
SEARCHABLES[resource.singular_name.to_sym] || DEFAULT_SEARCHABLES
|
|
@@ -43,59 +75,31 @@ module HammerCLIForeman
|
|
|
43
75
|
end
|
|
44
76
|
|
|
45
77
|
def scoped_options(scope, options)
|
|
46
|
-
prefix = HammerCLI.option_accessor_name("#{scope}_")
|
|
47
|
-
plain_prefix = HammerCLI.option_accessor_name("")
|
|
48
|
-
|
|
49
78
|
scoped_options = options.dup
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
79
|
+
|
|
80
|
+
resource = HammerCLIForeman.param_to_resource(scope)
|
|
81
|
+
return scoped_options unless resource
|
|
82
|
+
|
|
83
|
+
option_names = searchables(resource).map { |s| s.name }
|
|
84
|
+
option_names << "id"
|
|
85
|
+
|
|
86
|
+
option_names.each do |name|
|
|
87
|
+
option = HammerCLI.option_accessor_name(name)
|
|
88
|
+
scoped_option = HammerCLI.option_accessor_name("#{scope}_#{name}")
|
|
89
|
+
# remove the scope
|
|
90
|
+
# e.g. option_architecture_id -> option_id
|
|
91
|
+
if scoped_options[scoped_option]
|
|
92
|
+
scoped_options[option] = scoped_options.delete(scoped_option)
|
|
93
|
+
else
|
|
94
|
+
scoped_options.delete(option)
|
|
56
95
|
end
|
|
57
96
|
end
|
|
58
97
|
scoped_options
|
|
59
98
|
end
|
|
60
99
|
|
|
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
100
|
|
|
86
101
|
protected
|
|
87
102
|
|
|
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
103
|
def define_id_finders
|
|
100
104
|
@api.resources.each do |resource|
|
|
101
105
|
method_name = "#{resource.singular_name}_id"
|
|
@@ -114,7 +118,7 @@ module HammerCLIForeman
|
|
|
114
118
|
resource = @api.resource(resource_name)
|
|
115
119
|
|
|
116
120
|
search_options = search_options(options, resource)
|
|
117
|
-
|
|
121
|
+
IdParamsFilter.new(:only_required => true).for_action(resource.action(:index)).each do |param|
|
|
118
122
|
search_options[param.name] ||= send(param.name, scoped_options(param.name.gsub(/_id$/, ""), options))
|
|
119
123
|
end
|
|
120
124
|
resource.action(:index).routes.each do |route|
|
|
@@ -139,7 +143,12 @@ module HammerCLIForeman
|
|
|
139
143
|
end
|
|
140
144
|
|
|
141
145
|
def search_options(options, resource)
|
|
142
|
-
|
|
146
|
+
method = "create_#{resource.name}_search_options"
|
|
147
|
+
search_options = if respond_to?(method)
|
|
148
|
+
send(method, options)
|
|
149
|
+
else
|
|
150
|
+
create_search_options(options, resource)
|
|
151
|
+
end
|
|
143
152
|
raise MissingSeachOptions.new(_("Missing options to search %s") % resource.singular_name) if search_options.empty?
|
|
144
153
|
search_options
|
|
145
154
|
end
|
|
@@ -40,7 +40,9 @@ module HammerCLIForeman
|
|
|
40
40
|
HammerCLIForeman::References.timestamps(self)
|
|
41
41
|
end
|
|
42
42
|
|
|
43
|
-
build_options
|
|
43
|
+
build_options do |o|
|
|
44
|
+
o.expand.primary(:organizations)
|
|
45
|
+
end
|
|
44
46
|
end
|
|
45
47
|
|
|
46
48
|
|
|
@@ -74,7 +76,9 @@ module HammerCLIForeman
|
|
|
74
76
|
success_message _("Location deleted")
|
|
75
77
|
failure_message _("Could not delete the location")
|
|
76
78
|
|
|
77
|
-
build_options
|
|
79
|
+
build_options do |o|
|
|
80
|
+
o.expand.primary(:organizations)
|
|
81
|
+
end
|
|
78
82
|
end
|
|
79
83
|
|
|
80
84
|
HammerCLIForeman::AssociatingCommands::Hostgroup.extend_command(self)
|
|
@@ -93,5 +97,5 @@ module HammerCLIForeman
|
|
|
93
97
|
|
|
94
98
|
end
|
|
95
99
|
|
|
96
|
-
|
|
100
|
+
|
|
97
101
|
|
|
@@ -56,7 +56,7 @@ module HammerCLIForeman
|
|
|
56
56
|
failure_message _("Could not create the operating system")
|
|
57
57
|
|
|
58
58
|
def request_params
|
|
59
|
-
params =
|
|
59
|
+
params = super
|
|
60
60
|
params["operatingsystem"]["architecture_ids"] = option_architecture_ids if option_architecture_ids
|
|
61
61
|
params["operatingsystem"]["config_template_ids"] = option_config_template_ids if option_config_template_ids
|
|
62
62
|
params["operatingsystem"]["medium_ids"] = option_medium_ids if option_medium_ids
|
|
@@ -83,7 +83,7 @@ module HammerCLIForeman
|
|
|
83
83
|
failure_message _("Could not update the operating system")
|
|
84
84
|
|
|
85
85
|
def request_params
|
|
86
|
-
params =
|
|
86
|
+
params = super
|
|
87
87
|
params["operatingsystem"]["architecture_ids"] = option_architecture_ids if option_architecture_ids
|
|
88
88
|
params["operatingsystem"]["config_template_ids"] = option_config_template_ids if option_config_template_ids
|
|
89
89
|
params["operatingsystem"]["medium_ids"] = option_medium_ids if option_medium_ids
|
|
@@ -146,7 +146,7 @@ module HammerCLIForeman
|
|
|
146
146
|
|
|
147
147
|
def option_type_name
|
|
148
148
|
tpl = HammerCLIForeman.collection_to_common_format(
|
|
149
|
-
HammerCLIForeman.foreman_resource(:config_templates).call(:show, {"id" => option_config_template_id}))
|
|
149
|
+
HammerCLIForeman.foreman_resource!(:config_templates).call(:show, {"id" => option_config_template_id}))
|
|
150
150
|
tpl[0]["template_kind_name"]
|
|
151
151
|
end
|
|
152
152
|
|
|
@@ -214,7 +214,7 @@ module HammerCLIForeman
|
|
|
214
214
|
tpl = templates.find { |p| p["template_kind_name"] == option_type }
|
|
215
215
|
|
|
216
216
|
if tpl.nil?
|
|
217
|
-
raise RuntimeError.new(_("Default template of type
|
|
217
|
+
raise RuntimeError.new(_("Default template of type %s not found") % option_type)
|
|
218
218
|
end
|
|
219
219
|
|
|
220
220
|
params = {
|
|
@@ -244,5 +244,3 @@ module HammerCLIForeman
|
|
|
244
244
|
|
|
245
245
|
end
|
|
246
246
|
|
|
247
|
-
HammerCLI::MainCommand.subcommand 'os', "Manipulate operating system.", HammerCLIForeman::OperatingSystem
|
|
248
|
-
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
module HammerCLIForeman
|
|
2
|
+
|
|
3
|
+
class BuildParams
|
|
4
|
+
|
|
5
|
+
class ExpansionParams
|
|
6
|
+
|
|
7
|
+
def initialize(params={})
|
|
8
|
+
@params = params || {}
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def except(*resource_names)
|
|
12
|
+
@params[:except] = resource_names
|
|
13
|
+
self
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def including(*resource_names)
|
|
17
|
+
@params[:including] = resource_names
|
|
18
|
+
self
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def only(*resource_names)
|
|
22
|
+
@params[:only] = resource_names
|
|
23
|
+
self
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def primary(resource_name)
|
|
27
|
+
@params[:primary] = resource_name
|
|
28
|
+
self
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def to_hash
|
|
32
|
+
@params
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def initialize(params={})
|
|
38
|
+
@params = params || {}
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def without(*option_names)
|
|
42
|
+
@params[:without] = option_names
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def expand(switch = :all)
|
|
46
|
+
@expansion ||= ExpansionParams.new(@params[:expand])
|
|
47
|
+
if (switch == :none)
|
|
48
|
+
@expansion.only()
|
|
49
|
+
end
|
|
50
|
+
@expansion
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def to_hash
|
|
54
|
+
@params[:expand] = @expansion.to_hash if @expansion
|
|
55
|
+
@params
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
class BuilderConfigurator
|
|
61
|
+
|
|
62
|
+
def initialize(searchables, dependency_resolver)
|
|
63
|
+
@searchables = searchables
|
|
64
|
+
@dependency_resolver = dependency_resolver
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def builders_for(resource, action)
|
|
68
|
+
builders = []
|
|
69
|
+
|
|
70
|
+
dependent_resources = []
|
|
71
|
+
|
|
72
|
+
if action.params.find{ |p| p.name == "id" }
|
|
73
|
+
builders << SearchablesOptionBuilder.new(resource, @searchables)
|
|
74
|
+
dependent_resources += @dependency_resolver.resource_dependencies(resource, :only_required => true, :recursive => true)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
dependent_resources += @dependency_resolver.action_dependencies(action, :only_required => false, :recursive => false)
|
|
78
|
+
dependent_resources += @dependency_resolver.action_dependencies(action, :only_required => true, :recursive => true)
|
|
79
|
+
|
|
80
|
+
unique(dependent_resources).each do |dep_resource|
|
|
81
|
+
builders << DependentSearchablesOptionBuilder.new(dep_resource, @searchables)
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
builders
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
protected
|
|
88
|
+
|
|
89
|
+
def unique(resources)
|
|
90
|
+
# ruby 1.8 hack - it does not support passing blocks to Array#uniq
|
|
91
|
+
resources.inject({}) do |h, r|
|
|
92
|
+
h.update(r.name => r)
|
|
93
|
+
end.values
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
class ForemanOptionBuilder < HammerCLI::OptionBuilderContainer
|
|
99
|
+
|
|
100
|
+
def initialize(searchables)
|
|
101
|
+
@searchables = searchables
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def build(builder_params={})
|
|
105
|
+
expansion_options = builder_params[:expand] || {}
|
|
106
|
+
|
|
107
|
+
allowed_resources = expansion_options[:only] || default_dependent_resources
|
|
108
|
+
allowed_resources -= expansion_options[:except] || []
|
|
109
|
+
allowed_resources += expansion_options[:including] || []
|
|
110
|
+
allowed_resources.uniq!
|
|
111
|
+
|
|
112
|
+
primary_resource = expansion_options[:primary]
|
|
113
|
+
|
|
114
|
+
to_remove = default_dependent_resources - allowed_resources
|
|
115
|
+
to_add = allowed_resources - default_dependent_resources
|
|
116
|
+
|
|
117
|
+
builders.reject! do |b|
|
|
118
|
+
b.class <= DependentSearchablesOptionBuilder && to_remove.include?(b.resource.name)
|
|
119
|
+
end
|
|
120
|
+
to_add.each do |resource_name|
|
|
121
|
+
builders << DependentSearchablesOptionBuilder.new(HammerCLIForeman.foreman_resource(resource_name), @searchables)
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
if !primary_resource.nil?
|
|
125
|
+
builders.reject! do |b|
|
|
126
|
+
b.class <= SearchablesOptionBuilder
|
|
127
|
+
end
|
|
128
|
+
builders << SearchablesOptionBuilder.new(HammerCLIForeman.foreman_resource(primary_resource), @searchables) if primary_resource != false
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
super
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def default_dependent_resources
|
|
135
|
+
dependent_searchable_builders.map(&:resource).map(&:name)
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
def dependent_searchable_builders
|
|
139
|
+
self.builders.select{|b| b.class <= DependentSearchablesOptionBuilder }
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
class SearchablesAbstractOptionBuilder < HammerCLI::AbstractOptionBuilder
|
|
145
|
+
|
|
146
|
+
protected
|
|
147
|
+
|
|
148
|
+
def description(param_name, action_name)
|
|
149
|
+
return " " unless @resource.has_action? action_name
|
|
150
|
+
|
|
151
|
+
params = ParamsNameFilter.new(param_name).for_action(@resource.action(action_name))
|
|
152
|
+
if params.empty?
|
|
153
|
+
return " "
|
|
154
|
+
else
|
|
155
|
+
return params[0].description
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
class SearchablesOptionBuilder < SearchablesAbstractOptionBuilder
|
|
162
|
+
|
|
163
|
+
def initialize(resource, searchables)
|
|
164
|
+
@resource = resource
|
|
165
|
+
@searchables = searchables
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
attr_reader :resource
|
|
169
|
+
|
|
170
|
+
def build(builder_params={})
|
|
171
|
+
@searchables.for(@resource).collect do |s|
|
|
172
|
+
option(
|
|
173
|
+
optionamize("--#{s.name}"),
|
|
174
|
+
s.name.upcase,
|
|
175
|
+
s.description
|
|
176
|
+
)
|
|
177
|
+
end
|
|
178
|
+
end
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
class DependentSearchablesOptionBuilder < SearchablesAbstractOptionBuilder
|
|
183
|
+
|
|
184
|
+
def initialize(resource, searchables)
|
|
185
|
+
@resource = resource
|
|
186
|
+
@searchables = searchables
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
attr_reader :resource
|
|
190
|
+
|
|
191
|
+
def build(builder_params={})
|
|
192
|
+
resource_name_map = builder_params[:resource_mapping] || {}
|
|
193
|
+
dependent_options(@resource, resource_name_map)
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
protected
|
|
197
|
+
|
|
198
|
+
def dependent_options(resource, resource_name_map)
|
|
199
|
+
options = []
|
|
200
|
+
searchables = @searchables.for(resource)
|
|
201
|
+
resource_name = resource.singular_name
|
|
202
|
+
aliased_name = aliased(resource_name, resource_name_map)
|
|
203
|
+
|
|
204
|
+
unless searchables.empty?
|
|
205
|
+
first = searchables[0]
|
|
206
|
+
remaining = searchables[1..-1] || []
|
|
207
|
+
|
|
208
|
+
# First option is named by the resource
|
|
209
|
+
# Eg. --organization with accessor option_organization_name
|
|
210
|
+
options << option(
|
|
211
|
+
optionamize("--#{aliased_name}"),
|
|
212
|
+
"#{aliased_name}_#{first.name}".upcase,
|
|
213
|
+
first.description || " ",
|
|
214
|
+
:attribute_name => HammerCLI.option_accessor_name("#{resource_name}_#{first.name}")
|
|
215
|
+
)
|
|
216
|
+
|
|
217
|
+
# Other options are named by the resource plus the searchable name
|
|
218
|
+
# Eg. --organization-label with accessor option_organization_label
|
|
219
|
+
remaining.each do |s|
|
|
220
|
+
options << option(
|
|
221
|
+
optionamize("--#{aliased_name}-#{s.name}"),
|
|
222
|
+
"#{aliased_name}_#{s.name}".upcase,
|
|
223
|
+
s.description || " ",
|
|
224
|
+
:attribute_name => HammerCLI.option_accessor_name("#{resource_name}_#{s.name}")
|
|
225
|
+
)
|
|
226
|
+
end
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
options << option(
|
|
230
|
+
optionamize("--#{aliased_name}-id"),
|
|
231
|
+
"#{aliased_name}_id".upcase,
|
|
232
|
+
description("id", :show),
|
|
233
|
+
:attribute_name => HammerCLI.option_accessor_name("#{resource_name}_id")
|
|
234
|
+
)
|
|
235
|
+
options
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
def aliased(name, resource_name_map)
|
|
239
|
+
resource_name_map[name.to_s] || resource_name_map[name.to_sym] || name
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
class SearchablesUpdateOptionBuilder < SearchablesAbstractOptionBuilder
|
|
245
|
+
|
|
246
|
+
def initialize(resource, searchables)
|
|
247
|
+
@resource = resource
|
|
248
|
+
@searchables = searchables
|
|
249
|
+
end
|
|
250
|
+
|
|
251
|
+
attr_reader :resource
|
|
252
|
+
|
|
253
|
+
def build(builder_params={})
|
|
254
|
+
|
|
255
|
+
@searchables.for(@resource).collect do |s|
|
|
256
|
+
if s.editable?
|
|
257
|
+
option(
|
|
258
|
+
optionamize("--new-#{s.name}"),
|
|
259
|
+
"NEW_#{s.name.upcase}",
|
|
260
|
+
description(s.name, :update)
|
|
261
|
+
)
|
|
262
|
+
end
|
|
263
|
+
end.compact
|
|
264
|
+
end
|
|
265
|
+
|
|
266
|
+
end
|
|
267
|
+
|
|
268
|
+
# it adds id with description of the id param from resource's show action
|
|
269
|
+
class IdOptionBuilder < SearchablesAbstractOptionBuilder
|
|
270
|
+
|
|
271
|
+
def initialize(resource)
|
|
272
|
+
@resource = resource
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
attr_reader :resource
|
|
276
|
+
|
|
277
|
+
def build(builder_params={})
|
|
278
|
+
[
|
|
279
|
+
option("--id", "ID", description("id", :show))
|
|
280
|
+
]
|
|
281
|
+
end
|
|
282
|
+
|
|
283
|
+
end
|
|
284
|
+
|
|
285
|
+
end
|