hammer_cli_foreman 0.0.10 → 0.0.11
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.
- checksums.yaml +4 -4
- data/README.md +27 -0
- data/doc/host_create.md +190 -0
- data/lib/hammer_cli_foreman.rb +1 -0
- data/lib/hammer_cli_foreman/commands.rb +21 -7
- data/lib/hammer_cli_foreman/common_parameter.rb +12 -18
- data/lib/hammer_cli_foreman/domain.rb +8 -6
- data/lib/hammer_cli_foreman/environment.rb +10 -0
- data/lib/hammer_cli_foreman/exception_handler.rb +11 -1
- data/lib/hammer_cli_foreman/exceptions.rb +9 -0
- data/lib/hammer_cli_foreman/host.rb +107 -16
- data/lib/hammer_cli_foreman/hostgroup.rb +10 -0
- data/lib/hammer_cli_foreman/puppet_class.rb +10 -1
- data/lib/hammer_cli_foreman/resource_supported_test.rb +3 -3
- data/lib/hammer_cli_foreman/smart_class_parameter.rb +110 -0
- data/lib/hammer_cli_foreman/version.rb +1 -1
- data/test/unit/apipie_resource_mock.rb +88 -0
- data/test/unit/architecture_test.rb +91 -0
- data/test/unit/common_parameter_test.rb +77 -0
- data/test/unit/compute_resource_test.rb +94 -0
- data/test/unit/domain_test.rb +130 -0
- data/test/unit/environment_test.rb +110 -0
- data/test/unit/exception_handler_test.rb +48 -0
- data/test/unit/fact_test.rb +31 -0
- data/test/unit/helpers/command.rb +69 -0
- data/test/unit/helpers/resource_disabled.rb +24 -0
- data/test/unit/host_test.rb +315 -0
- data/test/unit/hostgroup_test.rb +145 -0
- data/test/unit/image_test.rb +136 -0
- data/test/unit/location_test.rb +109 -0
- data/test/unit/media_test.rb +106 -0
- data/test/unit/model_test.rb +98 -0
- data/test/unit/operating_system_test.rb +151 -0
- data/test/unit/organization_test.rb +109 -0
- data/test/unit/output/formatters_test.rb +19 -0
- data/test/unit/partition_table_test.rb +143 -0
- data/test/unit/puppet_class_test.rb +71 -0
- data/test/unit/report_test.rb +64 -0
- data/test/unit/smart_class_parameter_test.rb +77 -0
- data/test/unit/smart_proxy_test.rb +102 -0
- data/test/unit/subnet_test.rb +95 -0
- data/test/unit/template_test.rb +141 -0
- data/test/unit/test_helper.rb +27 -0
- data/test/unit/test_output_adapter.rb +19 -0
- data/test/unit/user_test.rb +92 -0
- metadata +107 -29
@@ -1,13 +1,15 @@
|
|
1
1
|
require 'hammer_cli/exception_handler'
|
2
|
+
require 'hammer_cli_foreman/exceptions'
|
2
3
|
|
3
4
|
module HammerCLIForeman
|
4
5
|
class ExceptionHandler < HammerCLI::ExceptionHandler
|
5
6
|
|
6
7
|
def mappings
|
7
8
|
super + [
|
9
|
+
[HammerCLIForeman::OperationNotSupportedError, :handle_unsupported_operation],
|
8
10
|
[RestClient::Forbidden, :handle_forbidden],
|
9
11
|
[RestClient::UnprocessableEntity, :handle_unprocessable_entity],
|
10
|
-
[ArgumentError, :handle_argument_error]
|
12
|
+
[ArgumentError, :handle_argument_error],
|
11
13
|
]
|
12
14
|
end
|
13
15
|
|
@@ -28,12 +30,20 @@ module HammerCLIForeman
|
|
28
30
|
HammerCLI::EX_USAGE
|
29
31
|
end
|
30
32
|
|
33
|
+
|
31
34
|
def handle_forbidden(e)
|
32
35
|
print_error "Forbidden - server refused to process the request"
|
33
36
|
log_full_error e
|
34
37
|
HammerCLI::EX_NOPERM
|
35
38
|
end
|
36
39
|
|
40
|
+
|
41
|
+
def handle_unsupported_operation(e)
|
42
|
+
print_error e.message
|
43
|
+
log_full_error e
|
44
|
+
HammerCLI::EX_UNAVAILABLE
|
45
|
+
end
|
46
|
+
|
37
47
|
end
|
38
48
|
end
|
39
49
|
|
@@ -4,6 +4,7 @@ require 'hammer_cli_foreman/commands'
|
|
4
4
|
require 'hammer_cli_foreman/parameter'
|
5
5
|
require 'hammer_cli_foreman/report'
|
6
6
|
require 'hammer_cli_foreman/puppet_class'
|
7
|
+
require 'hammer_cli_foreman/smart_class_parameter'
|
7
8
|
|
8
9
|
module HammerCLIForeman
|
9
10
|
|
@@ -59,8 +60,12 @@ module HammerCLIForeman
|
|
59
60
|
params['host']['host_parameters_attributes'] = parameter_attributes
|
60
61
|
params['host']['compute_attributes'] = compute_attributes || {}
|
61
62
|
params['host']['compute_attributes']['volumes_attributes'] = nested_attributes(volume_list)
|
62
|
-
|
63
|
-
|
63
|
+
if compute_resource_id
|
64
|
+
params['host']['compute_attributes']['interfaces_attributes'] = nested_attributes(interface_list)
|
65
|
+
params['host']['compute_attributes']['nics_attributes'] = nested_attributes(interface_list)
|
66
|
+
else
|
67
|
+
params['host']['interfaces_attributes'] = nested_attributes(interface_list)
|
68
|
+
end
|
64
69
|
|
65
70
|
params
|
66
71
|
end
|
@@ -87,11 +92,12 @@ module HammerCLIForeman
|
|
87
92
|
end
|
88
93
|
|
89
94
|
|
90
|
-
class Host < HammerCLI::
|
95
|
+
class Host < HammerCLI::Apipie::Command
|
96
|
+
|
97
|
+
resource ForemanApi::Resources::Host
|
98
|
+
|
91
99
|
class ListCommand < HammerCLIForeman::ListCommand
|
92
100
|
# FIXME: list compute resource (model)
|
93
|
-
resource ForemanApi::Resources::Host, "index"
|
94
|
-
|
95
101
|
output do
|
96
102
|
from "host" do
|
97
103
|
field :id, "Id"
|
@@ -109,8 +115,6 @@ module HammerCLIForeman
|
|
109
115
|
|
110
116
|
class InfoCommand < HammerCLIForeman::InfoCommand
|
111
117
|
|
112
|
-
resource ForemanApi::Resources::Host, "show"
|
113
|
-
|
114
118
|
def retrieve_data
|
115
119
|
host = super
|
116
120
|
host["host"]["environment_name"] = host["host"]["environment"]["environment"]["name"] rescue nil
|
@@ -167,13 +171,39 @@ module HammerCLIForeman
|
|
167
171
|
end
|
168
172
|
|
169
173
|
|
170
|
-
class StatusCommand <
|
174
|
+
class StatusCommand < HammerCLI::Apipie::ReadCommand
|
175
|
+
|
176
|
+
identifiers :id, :name
|
171
177
|
|
172
178
|
command_name "status"
|
173
|
-
resource ForemanApi::Resources::Host, "status"
|
174
179
|
|
175
|
-
|
176
|
-
|
180
|
+
output do
|
181
|
+
field :status, "Status"
|
182
|
+
field :power, "Power"
|
183
|
+
end
|
184
|
+
|
185
|
+
def retrieve_data
|
186
|
+
{
|
187
|
+
:status => get_status,
|
188
|
+
:power => get_power_status
|
189
|
+
}
|
190
|
+
end
|
191
|
+
|
192
|
+
def get_status
|
193
|
+
params = {
|
194
|
+
'id' => get_identifier[0],
|
195
|
+
}
|
196
|
+
status = resource.call(:status, params)[0]
|
197
|
+
status["status"]
|
198
|
+
end
|
199
|
+
|
200
|
+
def get_power_status
|
201
|
+
params = {
|
202
|
+
'id' => get_identifier[0],
|
203
|
+
'power_action' => :state
|
204
|
+
}
|
205
|
+
status = resource.call(:power, params)[0]
|
206
|
+
status["power"]
|
177
207
|
end
|
178
208
|
end
|
179
209
|
|
@@ -181,7 +211,7 @@ module HammerCLIForeman
|
|
181
211
|
class PuppetRunCommand < HammerCLIForeman::InfoCommand
|
182
212
|
|
183
213
|
command_name "puppetrun"
|
184
|
-
|
214
|
+
action "puppetrun"
|
185
215
|
|
186
216
|
def print_data(records)
|
187
217
|
print_message 'Puppet run triggered'
|
@@ -260,7 +290,7 @@ module HammerCLIForeman
|
|
260
290
|
|
261
291
|
success_message "Host created"
|
262
292
|
failure_message "Could not create the host"
|
263
|
-
|
293
|
+
action "create"
|
264
294
|
|
265
295
|
include HammerCLIForeman::CommonHostUpdateOptions
|
266
296
|
|
@@ -278,7 +308,6 @@ module HammerCLIForeman
|
|
278
308
|
|
279
309
|
success_message "Host updated"
|
280
310
|
failure_message "Could not update the host"
|
281
|
-
resource ForemanApi::Resources::Host, "update"
|
282
311
|
|
283
312
|
include HammerCLIForeman::CommonHostUpdateOptions
|
284
313
|
end
|
@@ -288,7 +317,6 @@ module HammerCLIForeman
|
|
288
317
|
|
289
318
|
success_message "Host deleted"
|
290
319
|
failure_message "Could not delete the host"
|
291
|
-
resource ForemanApi::Resources::Host, "destroy"
|
292
320
|
|
293
321
|
apipie_options
|
294
322
|
end
|
@@ -339,10 +367,73 @@ module HammerCLIForeman
|
|
339
367
|
end
|
340
368
|
end
|
341
369
|
|
370
|
+
|
371
|
+
class StartCommand < HammerCLI::Apipie::WriteCommand
|
372
|
+
|
373
|
+
identifiers :id, :name
|
374
|
+
action "power"
|
375
|
+
|
376
|
+
command_name "start"
|
377
|
+
desc "Power a host on"
|
378
|
+
success_message "The host is starting."
|
379
|
+
|
380
|
+
def power_action
|
381
|
+
:start
|
382
|
+
end
|
383
|
+
end
|
384
|
+
|
385
|
+
|
386
|
+
class StopCommand < HammerCLI::Apipie::WriteCommand
|
387
|
+
|
388
|
+
option '--force', :flag, "Force turning off a host"
|
389
|
+
|
390
|
+
identifiers :id, :name
|
391
|
+
action "power"
|
392
|
+
|
393
|
+
command_name "stop"
|
394
|
+
desc "Power a host off"
|
395
|
+
|
396
|
+
def power_action
|
397
|
+
if force?
|
398
|
+
:cycle
|
399
|
+
else
|
400
|
+
:stop
|
401
|
+
end
|
402
|
+
end
|
403
|
+
|
404
|
+
def success_message
|
405
|
+
if force?
|
406
|
+
"Power off forced."
|
407
|
+
else
|
408
|
+
"Powering the host off."
|
409
|
+
end
|
410
|
+
end
|
411
|
+
end
|
412
|
+
|
413
|
+
class RebootCommand < HammerCLI::Apipie::WriteCommand
|
414
|
+
|
415
|
+
identifiers :id, :name
|
416
|
+
action "power"
|
417
|
+
|
418
|
+
command_name "reboot"
|
419
|
+
desc "Reboot a host"
|
420
|
+
success_message "Host reboot started."
|
421
|
+
|
422
|
+
def power_action
|
423
|
+
:soft
|
424
|
+
end
|
425
|
+
end
|
426
|
+
|
427
|
+
class SCParamsCommand < HammerCLIForeman::SmartClassParametersList
|
428
|
+
|
429
|
+
apipie_options :without => [:host_id, :hostgroup_id, :puppetclass_id, :environment_id]
|
430
|
+
option ['--id', '--name'], 'HOST_ID', 'host id/name',
|
431
|
+
:attribute_name => :host_id, :required => true
|
432
|
+
end
|
433
|
+
|
342
434
|
autoload_subcommands
|
343
435
|
end
|
344
436
|
|
345
437
|
end
|
346
438
|
|
347
439
|
HammerCLI::MainCommand.subcommand 'host', "Manipulate Foreman's hosts.", HammerCLIForeman::Host
|
348
|
-
|
@@ -2,6 +2,7 @@ require 'hammer_cli'
|
|
2
2
|
require 'foreman_api'
|
3
3
|
require 'hammer_cli_foreman/commands'
|
4
4
|
require 'hammer_cli_foreman/parameter'
|
5
|
+
require 'hammer_cli_foreman/smart_class_parameter'
|
5
6
|
|
6
7
|
module HammerCLIForeman
|
7
8
|
|
@@ -137,6 +138,15 @@ module HammerCLIForeman
|
|
137
138
|
end
|
138
139
|
end
|
139
140
|
|
141
|
+
|
142
|
+
class SCParamsCommand < HammerCLIForeman::SmartClassParametersList
|
143
|
+
|
144
|
+
apipie_options :without => [:host_id, :hostgroup_id, :puppetclass_id, :environment_id]
|
145
|
+
option ['--id', '--name'], 'HOSTGROUP_ID', 'hostgroup id/name',
|
146
|
+
:attribute_name => :hostgroup_id, :required => true
|
147
|
+
end
|
148
|
+
|
149
|
+
|
140
150
|
autoload_subcommands
|
141
151
|
end
|
142
152
|
|
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'hammer_cli'
|
2
2
|
require 'foreman_api'
|
3
3
|
require 'hammer_cli_foreman/commands'
|
4
|
+
require 'hammer_cli_foreman/smart_class_parameter'
|
4
5
|
|
5
6
|
module HammerCLIForeman
|
6
7
|
|
@@ -46,10 +47,18 @@ module HammerCLIForeman
|
|
46
47
|
end
|
47
48
|
|
48
49
|
|
50
|
+
class SCParamsCommand < HammerCLIForeman::SmartClassParametersBriefList
|
51
|
+
|
52
|
+
apipie_options :without => [:host_id, :hostgroup_id, :puppetclass_id, :environment_id]
|
53
|
+
option ['--id', '--name'], 'PUPPET_CLASS_ID', 'puppet class id/name',
|
54
|
+
:attribute_name => :puppetclass_id, :required => true
|
55
|
+
end
|
56
|
+
|
57
|
+
|
49
58
|
autoload_subcommands
|
50
59
|
end
|
51
60
|
|
52
61
|
end
|
53
62
|
|
54
|
-
HammerCLI::MainCommand.subcommand 'puppet_class', "
|
63
|
+
HammerCLI::MainCommand.subcommand 'puppet_class', "Search Foreman's puppet modules.", HammerCLIForeman::PuppetClass
|
55
64
|
|
@@ -1,14 +1,14 @@
|
|
1
1
|
module HammerCLIForeman
|
2
2
|
|
3
|
+
class OperationNotSupportedError < StandardError; end
|
4
|
+
|
3
5
|
module ResourceSupportedTest
|
4
6
|
|
5
7
|
def execute
|
6
8
|
if resource_supported?
|
7
9
|
super
|
8
10
|
else
|
9
|
-
|
10
|
-
HammerCLI::Output::Output.print_error error, nil, context, :adapter => adapter
|
11
|
-
1
|
11
|
+
raise OperationNotSupportedError, "The server does not support such operation."
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
@@ -0,0 +1,110 @@
|
|
1
|
+
require 'hammer_cli'
|
2
|
+
require 'foreman_api'
|
3
|
+
require 'hammer_cli_foreman/commands'
|
4
|
+
|
5
|
+
module HammerCLIForeman
|
6
|
+
|
7
|
+
class SmartClassParametersBriefList < HammerCLIForeman::ListCommand
|
8
|
+
resource ForemanApi::Resources::SmartClassParameter, "index"
|
9
|
+
command_name 'sc_params'
|
10
|
+
|
11
|
+
output do
|
12
|
+
field :id, "Id"
|
13
|
+
|
14
|
+
field :parameter, "Parameter"
|
15
|
+
field :default_value, "Default Value"
|
16
|
+
field :override, "Override"
|
17
|
+
end
|
18
|
+
|
19
|
+
def retrieve_data
|
20
|
+
res = super
|
21
|
+
# FIXME: API returns doubled records, probably just if filtered by puppetclasses
|
22
|
+
# it seems group by environment is missing
|
23
|
+
# having the uniq to fix that
|
24
|
+
res["smart_class_parameters"].uniq
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
class SmartClassParametersList < SmartClassParametersBriefList
|
29
|
+
|
30
|
+
output do
|
31
|
+
from :puppetclass do
|
32
|
+
field :name, "Puppet class"
|
33
|
+
field :id, "Class Id", Fields::Id
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
class SmartClassParameter < HammerCLI::Apipie::Command
|
39
|
+
|
40
|
+
resource ForemanApi::Resources::SmartClassParameter
|
41
|
+
|
42
|
+
class ListCommand < HammerCLIForeman::SmartClassParametersList
|
43
|
+
command_name 'list'
|
44
|
+
apipie_options
|
45
|
+
end
|
46
|
+
|
47
|
+
class InfoCommand < HammerCLIForeman::InfoCommand
|
48
|
+
|
49
|
+
output ListCommand.output_definition do
|
50
|
+
field :description, "Description"
|
51
|
+
field :parameter_type, "Type"
|
52
|
+
field :required, "Required"
|
53
|
+
field :_environments, "Environments", Fields::List
|
54
|
+
field :_environment_ids, "Environment Ids", Fields::List
|
55
|
+
label "Validator" do
|
56
|
+
field :validator_type, "Type"
|
57
|
+
field :validator_rule, "Rule"
|
58
|
+
end
|
59
|
+
label "Override values" do
|
60
|
+
field :override_value_order, "Order", Fields::List
|
61
|
+
field :override_values_count, "Count"
|
62
|
+
collection :override_values, "Values" do
|
63
|
+
label "Value" do
|
64
|
+
field :id, 'Id'
|
65
|
+
field :match, 'Match'
|
66
|
+
field :value, 'Value'
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
field :created_at, "Created at", Fields::Date
|
71
|
+
field :updated_at, "Updated at", Fields::Date
|
72
|
+
end
|
73
|
+
|
74
|
+
def retrieve_data
|
75
|
+
res = super['smart_class_parameter']
|
76
|
+
res['override_value_order'] = res['override_value_order'].split("\n")
|
77
|
+
res['_environments'] = res['environments'].map { |e| e['environment']['name']}
|
78
|
+
res['_environment_ids'] = res['environments'].map { |e| e['environment']['id']}
|
79
|
+
res
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
83
|
+
|
84
|
+
class UpdateCommand < HammerCLIForeman::UpdateCommand
|
85
|
+
# identifiers :id, :name
|
86
|
+
|
87
|
+
success_message "Parameter updated"
|
88
|
+
failure_message "Could not update the parameter"
|
89
|
+
|
90
|
+
apipie_options :without => [:parameter_type, :validator_type, :id, :override, :required]
|
91
|
+
|
92
|
+
option "--override", "OVERRIDE", "Override this parameter.",
|
93
|
+
:format => HammerCLI::Options::Normalizers::Bool.new
|
94
|
+
option "--required", "REQUIRED", "This parameter is required.",
|
95
|
+
:format => HammerCLI::Options::Normalizers::Bool.new
|
96
|
+
option "--parameter-type", "PARAMETER_TYPE", "Type of the parameter.",
|
97
|
+
:format => HammerCLI::Options::Normalizers::Enum.new(
|
98
|
+
['string', 'boolean', 'integer', 'real', 'array', 'hash', 'yaml', 'json'])
|
99
|
+
option "--validator-type", "VALIDATOR_TYPE", "Type of the validator.",
|
100
|
+
:format => HammerCLI::Options::Normalizers::Enum.new(['regexp', 'list', ''])
|
101
|
+
end
|
102
|
+
|
103
|
+
|
104
|
+
autoload_subcommands
|
105
|
+
|
106
|
+
end
|
107
|
+
|
108
|
+
HammerCLI::MainCommand.subcommand 'sc_param', "Manipulate Foreman's smart class parameters.", HammerCLIForeman::SmartClassParameter
|
109
|
+
|
110
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
class ApipieResourceMock
|
2
|
+
|
3
|
+
def initialize(resource)
|
4
|
+
@return_values = {}
|
5
|
+
@resource = resource
|
6
|
+
@resource.doc["methods"].each do |method|
|
7
|
+
stub_method(method["name"], get_return_value(method))
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def doc
|
12
|
+
@resource.doc
|
13
|
+
end
|
14
|
+
|
15
|
+
def new(attrs)
|
16
|
+
return self
|
17
|
+
end
|
18
|
+
|
19
|
+
def expects_with(method_name, params, return_value=nil)
|
20
|
+
return_value ||= return_value_for(method_name)
|
21
|
+
self.expects(method_name).with(params).returns(return_value)
|
22
|
+
end
|
23
|
+
|
24
|
+
def stub_method(method_name, return_value)
|
25
|
+
self.stubs(method_name.to_s).returns([return_value, return_value.to_s])
|
26
|
+
@return_values[method_name.to_s] = return_value
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def return_value_for(method_name)
|
32
|
+
@return_values[method_name.to_s]
|
33
|
+
end
|
34
|
+
|
35
|
+
def get_return_value(method)
|
36
|
+
return nil if method["examples"].empty?
|
37
|
+
|
38
|
+
#parse actual json from the example string
|
39
|
+
#examples are in format:
|
40
|
+
# METHOD /api/some/route
|
41
|
+
# <input params in json, multiline>
|
42
|
+
# RETURN_CODE
|
43
|
+
# <output in json, multiline>
|
44
|
+
parse_re = /.*(\n\d+\n)(.*)/m
|
45
|
+
json_string = method["examples"][0][parse_re, 2]
|
46
|
+
response = JSON.parse(json_string) rescue json_string
|
47
|
+
|
48
|
+
response
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
|
54
|
+
class ApipieDisabledResourceMock
|
55
|
+
|
56
|
+
def initialize(resource)
|
57
|
+
@resource = resource
|
58
|
+
@resource.doc["methods"].each do |method|
|
59
|
+
self.stubs(method["name"]).raises(RestClient::ResourceNotFound)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def doc
|
64
|
+
@resource.doc
|
65
|
+
end
|
66
|
+
|
67
|
+
def new(attrs)
|
68
|
+
return self
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
|
73
|
+
def mock_resource_method(method, response)
|
74
|
+
resource_mock = ApipieResourceMock.new(cmd.class.resource.resource_class)
|
75
|
+
resource_mock.stubs(method).returns(response)
|
76
|
+
cmd.class.resource resource_mock
|
77
|
+
end
|
78
|
+
|
79
|
+
module ResourceMocks
|
80
|
+
|
81
|
+
def self.smart_class_parameter
|
82
|
+
sc_params = ApipieResourceMock.new(ForemanApi::Resources::SmartClassParameter)
|
83
|
+
sc_params.stubs(:index).returns([{ 'smart_class_parameters' => [ {} ] }, ""])
|
84
|
+
sc_params.stubs(:show).returns([{ 'smart_class_parameter' => { 'override_value_order' => '', 'environments' => [] }}, ""])
|
85
|
+
sc_params
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|