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.
- checksums.yaml +4 -4
- data/README.md +12 -1
- data/doc/configuration.md +13 -0
- data/lib/hammer_cli_foreman.rb +3 -0
- data/lib/hammer_cli_foreman/architecture.rb +9 -9
- data/lib/hammer_cli_foreman/associating_commands.rb +57 -34
- data/lib/hammer_cli_foreman/commands.rb +188 -101
- data/lib/hammer_cli_foreman/common_parameter.rb +7 -10
- data/lib/hammer_cli_foreman/compute_resource.rb +8 -11
- data/lib/hammer_cli_foreman/domain.rb +14 -40
- data/lib/hammer_cli_foreman/environment.rb +10 -15
- data/lib/hammer_cli_foreman/exceptions.rb +4 -0
- data/lib/hammer_cli_foreman/fact.rb +5 -5
- data/lib/hammer_cli_foreman/host.rb +76 -132
- data/lib/hammer_cli_foreman/hostgroup.rb +26 -61
- data/lib/hammer_cli_foreman/id_resolver.rb +163 -0
- data/lib/hammer_cli_foreman/image.rb +14 -50
- data/lib/hammer_cli_foreman/location.rb +35 -17
- data/lib/hammer_cli_foreman/media.rb +9 -16
- data/lib/hammer_cli_foreman/model.rb +6 -8
- data/lib/hammer_cli_foreman/operating_system.rb +129 -63
- data/lib/hammer_cli_foreman/organization.rb +36 -16
- data/lib/hammer_cli_foreman/output/fields.rb +10 -2
- data/lib/hammer_cli_foreman/output/formatters.rb +44 -18
- data/lib/hammer_cli_foreman/parameter.rb +45 -41
- data/lib/hammer_cli_foreman/partition_table.rb +9 -12
- data/lib/hammer_cli_foreman/puppet_class.rb +14 -14
- data/lib/hammer_cli_foreman/references.rb +122 -0
- data/lib/hammer_cli_foreman/report.rb +3 -6
- data/lib/hammer_cli_foreman/searchables_option_builder.rb +99 -0
- data/lib/hammer_cli_foreman/smart_class_parameter.rb +17 -13
- data/lib/hammer_cli_foreman/smart_proxy.rb +18 -28
- data/lib/hammer_cli_foreman/subnet.rb +12 -13
- data/lib/hammer_cli_foreman/template.rb +10 -19
- data/lib/hammer_cli_foreman/user.rb +9 -28
- data/lib/hammer_cli_foreman/version.rb +1 -1
- data/locale/hammer-cli-foreman.pot +828 -817
- data/test/unit/apipie_resource_mock.rb +33 -11
- data/test/unit/architecture_test.rb +7 -10
- data/test/unit/commands_test.rb +8 -9
- data/test/unit/common_parameter_test.rb +6 -8
- data/test/unit/compute_resource_test.rb +9 -12
- data/test/unit/data/1.5/foreman_api.json +14130 -0
- data/test/unit/domain_test.rb +19 -22
- data/test/unit/environment_test.rb +9 -11
- data/test/unit/fact_test.rb +5 -6
- data/test/unit/helpers/command.rb +115 -59
- data/test/unit/helpers/fake_searchables.rb +19 -0
- data/test/unit/host_test.rb +44 -33
- data/test/unit/hostgroup_test.rb +19 -26
- data/test/unit/id_resolver_test.rb +225 -0
- data/test/unit/image_test.rb +16 -18
- data/test/unit/location_test.rb +8 -10
- data/test/unit/media_test.rb +11 -13
- data/test/unit/model_test.rb +8 -10
- data/test/unit/operating_system_test.rb +23 -23
- data/test/unit/organization_test.rb +9 -10
- data/test/unit/output/formatters_test.rb +133 -20
- data/test/unit/partition_table_test.rb +12 -9
- data/test/unit/puppet_class_test.rb +3 -7
- data/test/unit/report_test.rb +3 -7
- data/test/unit/searchables_option_builder_test.rb +172 -0
- data/test/unit/smart_class_parameter_test.rb +5 -7
- data/test/unit/smart_proxy_test.rb +11 -12
- data/test/unit/subnet_test.rb +15 -16
- data/test/unit/template_test.rb +15 -12
- data/test/unit/test_helper.rb +1 -1
- data/test/unit/user_test.rb +9 -12
- 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
|
26
|
-
field
|
27
|
-
field
|
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
|
-
|
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
|
-
|
48
|
-
field nil, nil, Fields::KeyValue
|
49
|
-
end
|
50
|
-
end
|
38
|
+
field nil, _("Subnet"), Fields::SingleReference, :key => :subnet
|
51
39
|
|
52
|
-
|
53
|
-
|
54
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
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
|
103
|
+
params['hostgroup_id'] = get_identifier
|
118
104
|
params
|
119
105
|
end
|
120
106
|
|
121
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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.
|
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, :
|
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
|
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
|
46
|
+
field nil, _("Architecture"), Fields::SingleReference, :key => :architecture
|
56
47
|
field :iam_role, _("IAM role")
|
57
|
-
|
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
|
-
|
59
|
+
option "--compute-resource-id", "ID", " "
|
60
|
+
option "--compute-resource", "NAME", " ", :attribute_name => :option_compute_resource_name
|
77
61
|
|
78
|
-
|
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']
|
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
|