hammer_cli_foreman 3.0.0 → 3.1.0
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/doc/release_notes.md +13 -0
- data/lib/hammer_cli_foreman/command_extensions/subnet.rb +25 -10
- data/lib/hammer_cli_foreman/command_extensions/user.rb +9 -5
- data/lib/hammer_cli_foreman/commands.rb +1 -2
- data/lib/hammer_cli_foreman/compute_attribute.rb +1 -1
- data/lib/hammer_cli_foreman/compute_resource.rb +1 -0
- data/lib/hammer_cli_foreman/hostgroup.rb +13 -6
- data/lib/hammer_cli_foreman/hosts/common_update_options.rb +7 -7
- data/lib/hammer_cli_foreman/id_resolver.rb +7 -7
- data/lib/hammer_cli_foreman/option_builders.rb +65 -53
- data/lib/hammer_cli_foreman/option_sources/id_params.rb +21 -8
- data/lib/hammer_cli_foreman/option_sources/ids_params.rb +22 -9
- data/lib/hammer_cli_foreman/smart_proxy.rb +7 -5
- data/lib/hammer_cli_foreman/template.rb +3 -15
- data/lib/hammer_cli_foreman/user.rb +4 -4
- data/lib/hammer_cli_foreman/version.rb +1 -1
- data/locale/ca/LC_MESSAGES/hammer-cli-foreman.mo +0 -0
- data/locale/de/LC_MESSAGES/hammer-cli-foreman.mo +0 -0
- data/locale/en/LC_MESSAGES/hammer-cli-foreman.mo +0 -0
- data/locale/en_GB/LC_MESSAGES/hammer-cli-foreman.mo +0 -0
- data/locale/es/LC_MESSAGES/hammer-cli-foreman.mo +0 -0
- data/locale/fr/LC_MESSAGES/hammer-cli-foreman.mo +0 -0
- data/locale/it/LC_MESSAGES/hammer-cli-foreman.mo +0 -0
- data/locale/ja/LC_MESSAGES/hammer-cli-foreman.mo +0 -0
- data/locale/ko/LC_MESSAGES/hammer-cli-foreman.mo +0 -0
- data/locale/pt_BR/LC_MESSAGES/hammer-cli-foreman.mo +0 -0
- data/locale/ru/LC_MESSAGES/hammer-cli-foreman.mo +0 -0
- data/locale/zh_CN/LC_MESSAGES/hammer-cli-foreman.mo +0 -0
- data/locale/zh_TW/LC_MESSAGES/hammer-cli-foreman.mo +0 -0
- data/test/data/3.1/foreman_api.json +1 -0
- data/test/functional/compute_attribute_test.rb +20 -20
- data/test/functional/host_test.rb +34 -0
- data/test/functional/hostgroup/create_test.rb +11 -0
- data/test/functional/hostgroup/update_test.rb +11 -0
- data/test/functional/personal_access_token_test.rb +4 -4
- data/test/functional/template_test.rb +74 -14
- data/test/functional/user_mail_notification_test.rb +3 -3
- data/test/test_helper.rb +1 -1
- data/test/unit/commands_test.rb +1 -2
- data/test/unit/option_builders_test.rb +88 -83
- data/test/unit/option_sources/id_params_test.rb +0 -9
- data/test/unit/option_sources/ids_params_test.rb +0 -9
- metadata +28 -26
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 12d3353f9d530459e2a7f58e8f5603b1f52af4b2ee28aa51c6252bda84f5a5b3
|
4
|
+
data.tar.gz: cb323fd78217f8d5b5b1e7b69dd691ea85b3d332dcbbc2e375a668fc7043c298
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 04b1444a37f464ab35afdfd3832cf0549448484e9932972603ca5d29d7660a4bd599ab0cae461730a7fca5735712451553983724cbe5a23d8f6ffb0135e5510e
|
7
|
+
data.tar.gz: b625099ac29545814e7c73a1d74f0b20559b117bfabac2e2074c448557386c40e81a280ae2fb31271e3e5bd60b1c29c4a60881acfe4d5cbcad3f91cda05ca21c
|
data/doc/release_notes.md
CHANGED
@@ -1,5 +1,18 @@
|
|
1
1
|
Release notes
|
2
2
|
=============
|
3
|
+
### 3.1.0 (2021-11-10)
|
4
|
+
* Update test data for 3.1
|
5
|
+
* Make sure provided options override defaults, [#33711](http://projects.theforeman.org/issues/33711)
|
6
|
+
* Make template create/update commands use resolver, [#33721](http://projects.theforeman.org/issues/33721)
|
7
|
+
* Revert fix rake version
|
8
|
+
* Fix rake version
|
9
|
+
* Show status once for proxy info ([PR #581](https://github.com/theforeman/hammer-cli-foreman/pull/581)), [#19510](http://projects.theforeman.org/issues/19510)
|
10
|
+
* Add proxy status and version to info command ([PR #572](https://github.com/theforeman/hammer-cli-foreman/pull/572))
|
11
|
+
* Associate a vm via hammer to a compute resource, [#33047](http://projects.theforeman.org/issues/33047)
|
12
|
+
* Fix option builders and tests, [#33226](http://projects.theforeman.org/issues/33226)
|
13
|
+
* Bump to 3.1.0-develop
|
14
|
+
* Add parent title option for hostgroup, [#32878](http://projects.theforeman.org/issues/32878)
|
15
|
+
|
3
16
|
### 3.0.0 (2021-08-04)
|
4
17
|
* Puppet extraction ([PR #571](https://github.com/theforeman/hammer-cli-foreman/pull/571)), [#33174](http://projects.theforeman.org/issues/33174)
|
5
18
|
* Update rel-eng notebook ([PR #573](https://github.com/theforeman/hammer-cli-foreman/pull/573))
|
@@ -1,16 +1,7 @@
|
|
1
1
|
module HammerCLIForeman
|
2
2
|
module CommandExtensions
|
3
3
|
class Subnet < HammerCLI::CommandExtensions
|
4
|
-
option
|
5
|
-
attribute_name: :option_dns_name,
|
6
|
-
referenced_resource: :smart_proxy
|
7
|
-
option "--dhcp", "DHCP_NAME", _("DHCP Proxy to use within this subnet"),
|
8
|
-
attribute_name: :option_dhcp_name,
|
9
|
-
referenced_resource: :smart_proxy
|
10
|
-
option "--tftp", "TFTP_NAME", _("TFTP Proxy to use within this subnet"),
|
11
|
-
attribute_name: :option_tftp_name,
|
12
|
-
referenced_resource: :smart_proxy
|
13
|
-
option "--prefix", "PREFIX", _("Network prefix in CIDR notation (e.g. 64) for this subnet")
|
4
|
+
option '--prefix', 'PREFIX', _('Network prefix in CIDR notation (e.g. 64) for this subnet')
|
14
5
|
|
15
6
|
option_sources do |sources, command|
|
16
7
|
sources.find_by_name('IdResolution').insert_relative(
|
@@ -20,6 +11,30 @@ module HammerCLIForeman
|
|
20
11
|
)
|
21
12
|
sources
|
22
13
|
end
|
14
|
+
|
15
|
+
option_family associate: 'tftp' do
|
16
|
+
child '--tftp', 'TFTP_NAME', _('TFTP Proxy to use within this subnet'),
|
17
|
+
attribute_name: :option_tftp_name,
|
18
|
+
referenced_resource: :smart_proxy
|
19
|
+
end
|
20
|
+
|
21
|
+
option_family associate: 'dns' do
|
22
|
+
child '--dns', 'DNS_NAME', _('DNS Proxy to use within this subnet'),
|
23
|
+
attribute_name: :option_dns_name,
|
24
|
+
referenced_resource: :smart_proxy
|
25
|
+
end
|
26
|
+
|
27
|
+
option_family associate: 'dhcp' do
|
28
|
+
child '--dhcp', 'DHCP_NAME', _('DHCP Proxy to use within this subnet'),
|
29
|
+
attribute_name: :option_dhcp_name,
|
30
|
+
referenced_resource: :smart_proxy
|
31
|
+
end
|
32
|
+
|
33
|
+
option_family associate: 'bmc' do
|
34
|
+
child '--bmc', 'BMC_NAME', _('BMC Proxy to use within this subnet'),
|
35
|
+
attribute_name: :option_bmc_name,
|
36
|
+
referenced_resource: :smart_proxy
|
37
|
+
end
|
23
38
|
end
|
24
39
|
end
|
25
40
|
end
|
@@ -1,17 +1,21 @@
|
|
1
1
|
module HammerCLIForeman
|
2
2
|
module CommandExtensions
|
3
3
|
class User < HammerCLI::CommandExtensions
|
4
|
-
option '--default-organization', 'DEFAULT_ORGANIZATION_NAME', _('Default organization name'),
|
5
|
-
aliased_resource: 'default_organization', referenced_resource: 'default_organization'
|
6
|
-
option '--default-location', 'DEFAULT_LOCATION_NAME', _('Default location name'),
|
7
|
-
aliased_resource: 'default_location', referenced_resource: 'default_location'
|
8
|
-
|
9
4
|
option '--ask-password', 'ASK_PW', ' ', format: HammerCLI::Options::Normalizers::Bool.new
|
10
5
|
|
11
6
|
option_sources do |sources, command|
|
12
7
|
sources << HammerCLIForeman::OptionSources::UserParams.new(command)
|
13
8
|
sources
|
14
9
|
end
|
10
|
+
|
11
|
+
option_family associate: 'default_organization' do
|
12
|
+
child '--default-organization', 'DEFAULT_ORGANIZATION_NAME', _('Default organization name'),
|
13
|
+
aliased_resource: 'default_organization', referenced_resource: 'organization'
|
14
|
+
end
|
15
|
+
option_family associate: 'default_location' do
|
16
|
+
child '--default-location', 'DEFAULT_LOCATION_NAME', _('Default location name'),
|
17
|
+
aliased_resource: 'default_location', referenced_resource: 'location'
|
18
|
+
end
|
15
19
|
end
|
16
20
|
end
|
17
21
|
end
|
@@ -97,9 +97,8 @@ module HammerCLIForeman
|
|
97
97
|
configurator = BuilderConfigurator.new(searchables, dependency_resolver)
|
98
98
|
|
99
99
|
builder = ForemanOptionBuilder.new(searchables)
|
100
|
-
builder.builders =
|
100
|
+
builder.builders = super.builders
|
101
101
|
builder.builders += configurator.builders_for(resource, resource.action(action)) if resource_defined?
|
102
|
-
builder.builders += super.builders
|
103
102
|
builder
|
104
103
|
end
|
105
104
|
|
@@ -12,7 +12,7 @@ module HammerCLIForeman
|
|
12
12
|
profile = HammerCLIForeman.record_to_common_format(
|
13
13
|
HammerCLIForeman.foreman_resource(:compute_profiles).call(:show, 'id' => options['option_compute_profile_id'] )
|
14
14
|
)
|
15
|
-
params['compute_attribute'] = profile['compute_attributes'].select { |hash| hash['compute_resource_id'] == options['option_compute_resource_id']}[0] || {}
|
15
|
+
params['compute_attribute'] = profile['compute_attributes'].select { |hash| hash['compute_resource_id'].to_s == options['option_compute_resource_id'].to_s}[0] || {}
|
16
16
|
params['compute_attribute'].delete('attributes') if params['compute_attribute']['attributes']
|
17
17
|
params
|
18
18
|
end
|
@@ -107,6 +107,7 @@ module HammerCLIForeman
|
|
107
107
|
class AssociateVmsCommand < HammerCLIForeman::Command
|
108
108
|
action :associate
|
109
109
|
command_name 'associate-vms'
|
110
|
+
option "--vm-id","VM ID", _("Associate a specific VM")
|
110
111
|
success_message _("Virtual machines have been associated.")
|
111
112
|
failure_message _("Could not associate the virtual machines")
|
112
113
|
|
@@ -3,13 +3,20 @@ module HammerCLIForeman
|
|
3
3
|
module HostgroupUpdateCreateCommons
|
4
4
|
|
5
5
|
def self.included(base)
|
6
|
-
base.option
|
7
|
-
base.option
|
8
|
-
base.option ["--ask-root-password", "--ask-root-pass"], "ASK_ROOT_PW", "",
|
6
|
+
base.option '--root-password', 'ROOT_PASSWORD', _('Root password')
|
7
|
+
base.option '--ask-root-password', 'ASK_ROOT_PW', '',
|
9
8
|
format: HammerCLI::Options::Normalizers::Bool.new
|
10
|
-
base.option "--subnet6", "SUBNET6_NAME", _("Subnet IPv6 name")
|
11
9
|
|
12
10
|
base.build_options without: %i[root_pass]
|
11
|
+
|
12
|
+
base.option_family associate: 'subnet6' do
|
13
|
+
child '--subnet6', 'SUBNET6_NAME', _('Subnet IPv6 name')
|
14
|
+
end
|
15
|
+
|
16
|
+
base.option_family associate: 'parent' do
|
17
|
+
child '--parent', 'PARENT_NAME', _('Name of parent hostgroup')
|
18
|
+
child '--parent-title', 'PARENT_TITLE', _('Title of parent hostgroup')
|
19
|
+
end
|
13
20
|
end
|
14
21
|
|
15
22
|
def self.ask_password
|
@@ -19,8 +26,8 @@ module HammerCLIForeman
|
|
19
26
|
|
20
27
|
def request_params
|
21
28
|
params = super
|
22
|
-
params['hostgroup'][
|
23
|
-
|
29
|
+
params['hostgroup']['parent_id'] ||= resolver.hostgroup_id('option_name' => option_parent) if option_parent
|
30
|
+
params['hostgroup']['parent_id'] ||= resolver.hostgroup_id('option_title' => option_parent_title) if option_parent_title
|
24
31
|
params['hostgroup']['root_pass'] = option_root_password if option_root_password
|
25
32
|
params['hostgroup']['root_pass'] = HammerCLIForeman::HostgroupUpdateCreateCommons::ask_password if option_ask_root_password
|
26
33
|
|
@@ -3,11 +3,12 @@ module HammerCLIForeman
|
|
3
3
|
module CommonUpdateOptions
|
4
4
|
|
5
5
|
def self.included(base)
|
6
|
-
base.
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
6
|
+
base.option_family do
|
7
|
+
parent '--owner-id', 'OWNER_ID', _('ID of the owner'),
|
8
|
+
attribute_name: :option_owner_id
|
9
|
+
child '--owner', 'OWNER_LOGIN', _('Login of the owner'),
|
10
|
+
attribute_name: :option_user_login
|
11
|
+
end
|
11
12
|
base.option "--root-password", "ROOT_PW",
|
12
13
|
_("Required if host is managed and value is not inherited from host group or default password in settings")
|
13
14
|
|
@@ -112,14 +113,13 @@ module HammerCLIForeman
|
|
112
113
|
|
113
114
|
private
|
114
115
|
|
115
|
-
|
116
116
|
def owner_id(name, type)
|
117
117
|
return unless name
|
118
118
|
return resolver.usergroup_id('option_name' => name) if type == 'Usergroup'
|
119
119
|
|
120
120
|
resolver.user_id('option_login' => name)
|
121
121
|
end
|
122
|
-
|
122
|
+
|
123
123
|
def proxy_id(name)
|
124
124
|
resolver.smart_proxy_id('option_name' => name) if name
|
125
125
|
end
|
@@ -1,14 +1,12 @@
|
|
1
1
|
module HammerCLIForeman
|
2
2
|
|
3
3
|
class Searchable
|
4
|
-
attr_reader :name, :description
|
4
|
+
attr_reader :name, :description
|
5
5
|
|
6
6
|
def initialize(name, description, options={})
|
7
7
|
@name = name
|
8
8
|
@description = description
|
9
9
|
@editable = options[:editable].nil? ? true : options[:editable]
|
10
|
-
@format = options[:format]
|
11
|
-
@parent = options[:parent]
|
12
10
|
end
|
13
11
|
|
14
12
|
def plural_name
|
@@ -18,10 +16,6 @@ module HammerCLIForeman
|
|
18
16
|
def editable?
|
19
17
|
@editable
|
20
18
|
end
|
21
|
-
|
22
|
-
def parent?
|
23
|
-
@parent
|
24
|
-
end
|
25
19
|
end
|
26
20
|
|
27
21
|
class Searchables
|
@@ -130,6 +124,12 @@ module HammerCLIForeman
|
|
130
124
|
@searchables.for(resource)
|
131
125
|
end
|
132
126
|
|
127
|
+
def template_kind_id(options = {})
|
128
|
+
name = options['option_type'] == 'snippet' ? nil : options['option_type']
|
129
|
+
options['option_name'] = name
|
130
|
+
get_id(:template_kinds, options)
|
131
|
+
end
|
132
|
+
|
133
133
|
protected
|
134
134
|
|
135
135
|
def define_id_finders
|
@@ -172,8 +172,7 @@ module HammerCLIForeman
|
|
172
172
|
def build(builder_params={})
|
173
173
|
resource_name_map = builder_params[:resource_mapping] || {}
|
174
174
|
@searchables.for(@resource).collect do |s|
|
175
|
-
|
176
|
-
family.parent(
|
175
|
+
option(
|
177
176
|
optionamize("--#{s.name}"),
|
178
177
|
s.name.upcase,
|
179
178
|
s.description,
|
@@ -213,23 +212,43 @@ module HammerCLIForeman
|
|
213
212
|
|
214
213
|
def build(builder_params={})
|
215
214
|
resource_name_map = builder_params[:resource_mapping] || {}
|
216
|
-
|
215
|
+
command = builder_params[:command]
|
216
|
+
dependent_options(@resource, resource_name_map, command)
|
217
217
|
end
|
218
218
|
|
219
219
|
protected
|
220
220
|
|
221
|
-
def dependent_options(resource, resource_name_map)
|
221
|
+
def dependent_options(resource, resource_name_map, command)
|
222
222
|
options = []
|
223
223
|
searchables = @searchables.for(resource)
|
224
224
|
resource_name = resource.singular_name
|
225
225
|
aliased_name = aliased(resource_name, resource_name_map)
|
226
226
|
types = searchables.map(&:name).push('id').map(&:capitalize).join('/')
|
227
227
|
associated_resource = aliased_name.to_s.tr('_', ' ')
|
228
|
-
family =
|
229
|
-
referenced_resource
|
230
|
-
|
231
|
-
|
232
|
-
|
228
|
+
family = command.option_families.find do |f|
|
229
|
+
f.head.referenced_resource == resource_name
|
230
|
+
end
|
231
|
+
unless family
|
232
|
+
# If there is no family it probably means that we explicitly want to
|
233
|
+
# expand options via
|
234
|
+
# build_options do |o|
|
235
|
+
# o.expand.including(:resource)
|
236
|
+
# end
|
237
|
+
# instead of generating it from API docs (it may not be even present there)
|
238
|
+
family = HammerCLI::Options::OptionFamily.new(
|
239
|
+
description: _('%{types} of associated %{resource}') % { types: types, resource: associated_resource },
|
240
|
+
creator: command
|
241
|
+
)
|
242
|
+
options << family.parent(
|
243
|
+
optionamize("--#{aliased_name}-id"),
|
244
|
+
"#{aliased_name}_id".upcase,
|
245
|
+
description("#{aliased_name}_id", @context[:action]),
|
246
|
+
attribute_name: HammerCLI.option_accessor_name("#{resource_name}_id"),
|
247
|
+
referenced_resource: resource_name,
|
248
|
+
aliased_resource: aliased_name,
|
249
|
+
format: HammerCLI::Options::Normalizers::Number.new
|
250
|
+
)
|
251
|
+
end
|
233
252
|
|
234
253
|
unless searchables.empty?
|
235
254
|
first = searchables[0]
|
@@ -240,31 +259,25 @@ module HammerCLIForeman
|
|
240
259
|
options << family.child(
|
241
260
|
optionamize("--#{aliased_name}"),
|
242
261
|
"#{aliased_name}_#{first.name}".upcase,
|
243
|
-
first.description ||
|
244
|
-
attribute_name: HammerCLI.option_accessor_name("#{resource_name}_#{first.name}")
|
262
|
+
first.description || ' ',
|
263
|
+
attribute_name: HammerCLI.option_accessor_name("#{resource_name}_#{first.name}"),
|
264
|
+
referenced_resource: resource_name,
|
265
|
+
aliased_resource: aliased_name
|
245
266
|
)
|
246
267
|
# Other options are named by the resource plus the searchable name
|
247
268
|
# Eg. --organization-label with accessor option_organization_label
|
248
269
|
remaining.each do |s|
|
249
|
-
options << family.
|
270
|
+
options << family.child(
|
250
271
|
optionamize("--#{aliased_name}-#{s.name}"),
|
251
272
|
"#{aliased_name}_#{s.name}".upcase,
|
252
|
-
s.description ||
|
273
|
+
s.description || ' ',
|
253
274
|
attribute_name: HammerCLI.option_accessor_name("#{resource_name}_#{s.name}"),
|
254
|
-
|
275
|
+
referenced_resource: resource_name,
|
276
|
+
aliased_resource: aliased_name
|
255
277
|
)
|
256
278
|
end
|
257
279
|
end
|
258
280
|
|
259
|
-
unless options.any? { |o| o.handles?(optionamize("--#{aliased_name}-id")) }
|
260
|
-
options << family.parent(
|
261
|
-
optionamize("--#{aliased_name}-id"),
|
262
|
-
"#{aliased_name}_id".upcase,
|
263
|
-
description("#{aliased_name}_id", @context[:action]),
|
264
|
-
attribute_name: HammerCLI.option_accessor_name("#{resource_name}_id"),
|
265
|
-
format: HammerCLI::Options::Normalizers::Number.new
|
266
|
-
)
|
267
|
-
end
|
268
281
|
options
|
269
282
|
end
|
270
283
|
|
@@ -285,15 +298,25 @@ module HammerCLIForeman
|
|
285
298
|
class UpdateDependentSearchablesOptionBuilder < DependentSearchablesOptionBuilder
|
286
299
|
protected
|
287
300
|
|
288
|
-
def dependent_options(resource, resource_name_map)
|
301
|
+
def dependent_options(resource, resource_name_map, command)
|
289
302
|
options = []
|
290
303
|
searchables = @searchables.for(resource)
|
291
304
|
resource_name = resource.singular_name
|
292
305
|
aliased_name = aliased(resource_name, resource_name_map)
|
306
|
+
# Those options are not coming from API docs, thus create a new family only
|
293
307
|
family = HammerCLI::Options::OptionFamily.new(
|
294
308
|
prefix: 'new-',
|
295
309
|
aliased_resource: aliased_name,
|
296
|
-
referenced_resource: resource_name
|
310
|
+
referenced_resource: resource_name,
|
311
|
+
creator: command
|
312
|
+
)
|
313
|
+
|
314
|
+
options << family.parent(
|
315
|
+
optionamize("--new-#{aliased_name}-id"),
|
316
|
+
"new_#{aliased_name}_id".upcase,
|
317
|
+
_('Use to update associated %s') % aliased_name,
|
318
|
+
attribute_name: HammerCLI.option_accessor_name("new_#{resource_name}_id"),
|
319
|
+
format: HammerCLI::Options::Normalizers::Number.new
|
297
320
|
)
|
298
321
|
unless searchables.empty?
|
299
322
|
first = searchables[0]
|
@@ -304,73 +327,63 @@ module HammerCLIForeman
|
|
304
327
|
options << family.child(
|
305
328
|
optionamize("--new-#{aliased_name}"),
|
306
329
|
"new_#{aliased_name}_#{first.name}".upcase,
|
307
|
-
_('Use to update'),
|
330
|
+
_('Use to update associated %s') % aliased_name,
|
308
331
|
attribute_name: HammerCLI.option_accessor_name("new_#{resource_name}_#{first.name}")
|
309
332
|
)
|
310
333
|
# Other options are named by the resource plus the searchable name
|
311
334
|
# Eg. --new-organization-label with accessor option_new_organization_label
|
312
335
|
remaining.each do |s|
|
313
|
-
options << family.
|
336
|
+
options << family.child(
|
314
337
|
optionamize("--new-#{aliased_name}-#{s.name}"),
|
315
338
|
"new_#{aliased_name}_#{s.name}".upcase,
|
316
|
-
_('Use to update'),
|
339
|
+
_('Use to update associated %s') % aliased_name,
|
317
340
|
attribute_name: HammerCLI.option_accessor_name("new_#{resource_name}_#{s.name}")
|
318
341
|
)
|
319
342
|
end
|
320
343
|
end
|
321
344
|
|
322
|
-
unless options.any? { |o| o.handles?(optionamize("--new-#{aliased_name}-id")) }
|
323
|
-
options << family.parent(
|
324
|
-
optionamize("--new-#{aliased_name}-id"),
|
325
|
-
"new_#{aliased_name}_id".upcase,
|
326
|
-
_('Use to update'),
|
327
|
-
attribute_name: HammerCLI.option_accessor_name("new_#{resource_name}_id"),
|
328
|
-
format: HammerCLI::Options::Normalizers::Number.new
|
329
|
-
)
|
330
|
-
end
|
331
345
|
options
|
332
346
|
end
|
333
347
|
end
|
334
348
|
|
335
349
|
class DependentSearchablesArrayOptionBuilder < DependentSearchablesOptionBuilder
|
336
|
-
|
337
|
-
|
338
|
-
def dependent_options(resource, resource_name_map)
|
350
|
+
def dependent_options(resource, resource_name_map, command)
|
339
351
|
options = []
|
340
352
|
searchables = @searchables.for(resource)
|
341
353
|
resource_name = resource.singular_name
|
342
354
|
|
343
355
|
aliased_name = aliased(resource_name, resource_name_map)
|
344
356
|
aliased_plural_name = aliased(resource.name, resource_name_map)
|
345
|
-
|
346
357
|
unless searchables.empty?
|
347
358
|
first = searchables[0]
|
348
359
|
remaining = searchables[1..-1] || []
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
referenced_resource: resource_name,
|
354
|
-
aliased_resource: aliased_name,
|
355
|
-
description: _('%{types} of associated %{resource}') % { types: types, resource: associated_resource }
|
356
|
-
)
|
360
|
+
# Find family created by HammerCLI::Apipie::OptionBuilder for *_ids options
|
361
|
+
family = command.option_families.find do |f|
|
362
|
+
f.head.referenced_resource == resource_name && f.formats.include?(HammerCLI::Options::Normalizers::List)
|
363
|
+
end
|
357
364
|
# First option is named by the resource
|
358
365
|
# Eg. --organizations with accessor option_organization_names
|
359
366
|
options << family.child(
|
360
367
|
optionamize("--#{aliased_plural_name}"),
|
361
368
|
"#{aliased_name}_#{first.plural_name}".upcase,
|
362
369
|
' ',
|
363
|
-
attribute_name: HammerCLI.option_accessor_name("#{resource_name}_#{first.plural_name}")
|
370
|
+
attribute_name: HammerCLI.option_accessor_name("#{resource_name}_#{first.plural_name}"),
|
371
|
+
format: HammerCLI::Options::Normalizers::List.new,
|
372
|
+
referenced_resource: resource_name,
|
373
|
+
aliased_resource: aliased_name
|
364
374
|
)
|
365
375
|
|
366
376
|
# Other options are named by the resource plus the searchable name
|
367
377
|
# Eg. --organization-labels with accessor option_organization_labels
|
368
378
|
remaining.each do |s|
|
369
|
-
options << family.
|
379
|
+
options << family.child(
|
370
380
|
optionamize("--#{aliased_name}-#{s.plural_name}"),
|
371
381
|
"#{aliased_name}_#{s.plural_name}".upcase,
|
372
382
|
' ',
|
373
|
-
attribute_name: HammerCLI.option_accessor_name("#{resource_name}_#{s.plural_name}")
|
383
|
+
attribute_name: HammerCLI.option_accessor_name("#{resource_name}_#{s.plural_name}"),
|
384
|
+
format: HammerCLI::Options::Normalizers::List.new,
|
385
|
+
referenced_resource: resource_name,
|
386
|
+
aliased_resource: aliased_name
|
374
387
|
)
|
375
388
|
end
|
376
389
|
end
|
@@ -421,4 +434,3 @@ module HammerCLIForeman
|
|
421
434
|
end
|
422
435
|
|
423
436
|
end
|
424
|
-
|
@@ -6,7 +6,7 @@ module HammerCLIForeman
|
|
6
6
|
end
|
7
7
|
|
8
8
|
def param_updatable?(param_resource)
|
9
|
-
param_resource && @command.respond_to?(
|
9
|
+
param_resource && @command.respond_to?(cli_option_resource_id(param_resource))
|
10
10
|
end
|
11
11
|
|
12
12
|
def available_id_params
|
@@ -16,16 +16,23 @@ module HammerCLIForeman
|
|
16
16
|
def needs_resolving?(param_option, param_resource, all_opts)
|
17
17
|
return false unless param_updatable?(param_resource)
|
18
18
|
|
19
|
-
|
19
|
+
cli_searchables_set = @command.searchables.for(param_resource).any? do |s|
|
20
20
|
option = HammerCLI.option_accessor_name("#{param_resource.singular_name}_#{s.name}")
|
21
|
-
|
21
|
+
next false unless @command.respond_to?(option)
|
22
|
+
|
23
|
+
!@command.send(option).nil?
|
22
24
|
end
|
23
|
-
|
25
|
+
if cli_searchables_set
|
26
|
+
# Remove set '<resource_name>_id' option to force resolving in case of
|
27
|
+
# '<resource_name>_[name|title]' was set from CLI
|
28
|
+
all_opts.delete(param_option)
|
29
|
+
true
|
30
|
+
else
|
31
|
+
# Don't resolve if resource id was set via CLI
|
32
|
+
return false if @command.send(cli_option_resource_id(param_resource))
|
24
33
|
|
25
|
-
|
26
|
-
|
27
|
-
all_opts.delete(param_option)
|
28
|
-
true
|
34
|
+
all_opts[param_option].nil?
|
35
|
+
end
|
29
36
|
end
|
30
37
|
|
31
38
|
def get_options(_defined_options, result)
|
@@ -63,6 +70,12 @@ module HammerCLIForeman
|
|
63
70
|
e.resource
|
64
71
|
)
|
65
72
|
end
|
73
|
+
|
74
|
+
private
|
75
|
+
|
76
|
+
def cli_option_resource_id(resource)
|
77
|
+
HammerCLI.option_accessor_name("#{resource.singular_name}_id")
|
78
|
+
end
|
66
79
|
end
|
67
80
|
end
|
68
81
|
end
|
@@ -6,7 +6,7 @@ module HammerCLIForeman
|
|
6
6
|
end
|
7
7
|
|
8
8
|
def param_updatable?(param_resource)
|
9
|
-
param_resource && @command.respond_to?(
|
9
|
+
param_resource && @command.respond_to?(cli_option_resource_ids(param_resource))
|
10
10
|
end
|
11
11
|
|
12
12
|
def available_ids_params
|
@@ -16,16 +16,23 @@ module HammerCLIForeman
|
|
16
16
|
def needs_resolving?(param_option, param_resource, all_opts)
|
17
17
|
return false unless param_updatable?(param_resource)
|
18
18
|
|
19
|
-
|
19
|
+
cli_searchables_set = @command.searchables.for(param_resource).any? do |s|
|
20
20
|
option = HammerCLI.option_accessor_name("#{param_resource.singular_name}_#{s.plural_name}")
|
21
|
-
|
22
|
-
end
|
23
|
-
return all_opts[param_option].nil? unless searchables_set
|
21
|
+
next false unless @command.respond_to?(option)
|
24
22
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
23
|
+
!@command.send(option).nil?
|
24
|
+
end
|
25
|
+
if cli_searchables_set
|
26
|
+
# Remove set '<resource_name>_ids' option to force resolving in case of
|
27
|
+
# '<resource_name>_[names|titles]' were set from CLI
|
28
|
+
all_opts.delete(param_option)
|
29
|
+
true
|
30
|
+
else
|
31
|
+
# Don't resolve if resource ids were set via CLI
|
32
|
+
return false if @command.send(cli_option_resource_ids(param_resource))
|
33
|
+
|
34
|
+
all_opts[param_option].nil?
|
35
|
+
end
|
29
36
|
end
|
30
37
|
|
31
38
|
def get_options(_defined_options, result)
|
@@ -44,6 +51,12 @@ module HammerCLIForeman
|
|
44
51
|
end
|
45
52
|
result
|
46
53
|
end
|
54
|
+
|
55
|
+
private
|
56
|
+
|
57
|
+
def cli_option_resource_ids(resource)
|
58
|
+
HammerCLI.option_accessor_name("#{resource.singular_name}_ids")
|
59
|
+
end
|
47
60
|
end
|
48
61
|
end
|
49
62
|
end
|
@@ -10,8 +10,9 @@ module HammerCLIForeman
|
|
10
10
|
output do
|
11
11
|
field :id, _("Id")
|
12
12
|
field :name, _("Name")
|
13
|
+
field :status, _("Status")
|
13
14
|
field :url, _("URL")
|
14
|
-
field :_features, _( "Features"), Fields::List, :
|
15
|
+
field :_features, _( "Features"), Fields::List, :hide_blank => true
|
15
16
|
end
|
16
17
|
|
17
18
|
def extend_data(proxy)
|
@@ -22,12 +23,13 @@ module HammerCLIForeman
|
|
22
23
|
build_options
|
23
24
|
end
|
24
25
|
|
25
|
-
|
26
26
|
class InfoCommand < HammerCLIForeman::InfoCommand
|
27
|
-
|
28
27
|
output ListCommand.output_definition do
|
29
|
-
|
30
|
-
|
28
|
+
field :version, _("Version")
|
29
|
+
field :hosts_count, _("Host_count")
|
30
|
+
collection :features, _("Features") do
|
31
|
+
field :name, _('Name')
|
32
|
+
field :version, _('Version')
|
31
33
|
end
|
32
34
|
HammerCLIForeman::References.taxonomies(self)
|
33
35
|
HammerCLIForeman::References.timestamps(self)
|
@@ -5,25 +5,13 @@ module HammerCLIForeman
|
|
5
5
|
resource :provisioning_templates
|
6
6
|
|
7
7
|
module TemplateCreateUpdateCommons
|
8
|
-
|
9
8
|
def option_snippet
|
10
9
|
option_type && (option_type == "snippet")
|
11
10
|
end
|
12
11
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
signal_usage_error _("unknown template kind")
|
17
|
-
else
|
18
|
-
table[option_type]
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
def kinds
|
23
|
-
HammerCLIForeman.collection_to_common_format(
|
24
|
-
HammerCLIForeman.foreman_resource!(:template_kinds).call(:index))
|
25
|
-
end
|
26
|
-
|
12
|
+
# This method is for IdParams option source to make resolver work for
|
13
|
+
# --type option
|
14
|
+
def option_template_kind_id; end
|
27
15
|
end
|
28
16
|
|
29
17
|
class ListCommand < HammerCLIForeman::ListCommand
|