foreman_puppet 1.0.0 → 2.0.0.alpha.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/app/controllers/concerns/foreman_puppet/extensions/api_hostgroups_controller.rb +14 -16
- data/app/controllers/concerns/foreman_puppet/{api/import_puppetclasses_common_controller.rb → extensions/api_smart_proxies_controller.rb} +9 -3
- data/app/controllers/concerns/foreman_puppet/extensions/api_template_combinations_controller.rb +23 -1
- data/app/controllers/concerns/foreman_puppet/extensions/api_v2_hosts_controller.rb +15 -17
- data/app/controllers/concerns/foreman_puppet/extensions/hostgroups_controller_extensions.rb +4 -2
- data/app/controllers/concerns/foreman_puppet/extensions/hosts_controller_extensions.rb +1 -2
- data/app/controllers/concerns/foreman_puppet/extensions/parameters_hostgroup.rb +2 -8
- data/app/controllers/foreman_puppet/api/v2/environments_controller.rb +0 -1
- data/app/controllers/foreman_puppet/puppetclasses_controller.rb +1 -1
- data/app/helpers/foreman_puppet/hosts_and_hostgroups_helper.rb +0 -5
- data/app/helpers/foreman_puppet/hosts_helper.rb +6 -10
- data/app/helpers/foreman_puppet/puppet_smart_proxies_helper.rb +4 -0
- data/app/models/concerns/foreman_puppet/extensions/host.rb +2 -16
- data/app/models/concerns/foreman_puppet/extensions/hostgroup.rb +2 -7
- data/app/models/concerns/foreman_puppet/extensions/provisioning_template.rb +7 -12
- data/app/models/concerns/foreman_puppet/extensions/template_combination.rb +5 -10
- data/app/services/concerns/foreman_puppet/extensions/host_counter.rb +17 -0
- data/app/services/foreman_puppet/puppet_class_importer.rb +0 -6
- data/app/views/foreman_puppet/api/v2/host_puppet_facets/host_list.json.rabl +3 -0
- data/app/views/foreman_puppet/api/v2/hostgroup_puppet_facets/base.json.rabl +2 -0
- data/app/views/foreman_puppet/api/v2/hostgroup_puppet_facets/hostgroup_list.json.rabl +3 -0
- data/app/views/hosts/_form_puppet_enc_tab.html.erb +3 -4
- data/config/api_routes.rb +1 -9
- data/config/initializers/api_reroute.rb +73 -5
- data/db/migrate/20101121140000_add_environment_to_template_combinations.foreman_puppet.rb +1 -1
- data/db/migrate/20200803113803_migrate_environment_to_puppet_facet.foreman_puppet.rb +4 -2
- data/db/migrate/20210924103241_remove_katello_id_from_environments.foreman_puppet.rb +5 -0
- data/db/migrate_foreman/20090722141107_create_environments.rb +2 -2
- data/db/migrate_foreman/20090802062223_create_puppetclasses.rb +28 -0
- data/db/migrate_foreman/20090905150132_create_hostgroups_puppetclasses.rb +12 -0
- data/db/migrate_foreman/20110412103238_remove_unused_fields_from_puppet_classes.rb +9 -0
- data/db/migrate_foreman/20110712070522_create_host_class.rb +11 -0
- data/db/migrate_foreman/20120824142048_add_some_indexes.rb +14 -0
- data/db/migrate_foreman/20121018152459_create_hostgroup_classes.rb +11 -0
- data/db/migrate_foreman/20161205142618_delete_orphaned_smart_class_parameters.rb +1 -1
- data/db/migrate_foreman/20180816134832_cast_lookup_key_values.rb +1 -31
- data/db/migrate_foreman/20180831115634_add_uniqueness_to_puppetclass_name.rb +24 -0
- data/db/migrate_foreman/20181023112532_add_environment_puppetclass_id.rb +1 -1
- data/lib/foreman_puppet/engine.rb +6 -36
- data/lib/foreman_puppet/register.rb +16 -47
- data/lib/foreman_puppet/version.rb +1 -1
- data/lib/foreman_puppet.rb +1 -6
- data/locale/en/LC_MESSAGES/foreman_puppet.mo +0 -0
- data/locale/en/foreman_puppet.po +62 -8
- data/locale/foreman_puppet.pot +215 -133
- data/locale/gemspec.rb +1 -1
- data/package.json +8 -11
- data/test/controllers/foreman_puppet/api/v2/environments_controller_test.rb +0 -231
- data/test/controllers/foreman_puppet/api/v2/smart_proxies_controller_test.rb +255 -0
- data/test/controllers/foreman_puppet/environments_controller_test.rb +2 -2
- data/test/controllers/foreman_puppet/hostgroups_controller_test.rb +72 -52
- data/test/controllers/foreman_puppet/hosts_controller_test.rb +0 -1
- data/test/factories/foreman_puppet_factories.rb +0 -2
- data/test/factories/host_puppet_enhancements.rb +3 -0
- data/test/integration/foreman_puppet/host_js_test.rb +0 -1
- data/test/integration/foreman_puppet/puppetclass_js_test.rb +1 -1
- data/test/models/foreman_puppet/host_test.rb +26 -0
- data/test/models/foreman_puppet/user_test.rb +1 -5
- data/test/services/foreman_puppet/host_counter_test.rb +17 -0
- data/test/unit/foreman_puppet/puppet_class_importer_test.rb +1 -1
- data/webpack/src/Components/Environments/Welcome.js +2 -2
- metadata +22 -7
data/locale/gemspec.rb
CHANGED
@@ -1,2 +1,2 @@
|
|
1
1
|
# Matches foreman_puppet_enc.gemspec
|
2
|
-
_('Allow assigning Puppet
|
2
|
+
_('Allow assigning Puppet environments and classes to the Foreman Hosts.')
|
data/package.json
CHANGED
@@ -21,25 +21,22 @@
|
|
21
21
|
"url": "http://projects.theforeman.org/projects/foreman_puppet/issues"
|
22
22
|
},
|
23
23
|
"peerDependencies": {
|
24
|
-
"@theforeman/vendor": "
|
24
|
+
"@theforeman/vendor": "^8.15.0"
|
25
25
|
},
|
26
26
|
"devDependencies": {
|
27
27
|
"@babel/core": "^7.7.0",
|
28
28
|
"@sheerun/mutationobserver-shim": "^0.3.3",
|
29
|
-
"@theforeman/builder": "^
|
30
|
-
"@theforeman/eslint-plugin-foreman": "^
|
31
|
-
"@theforeman/find-foreman": "^
|
32
|
-
"@theforeman/stories": "^
|
33
|
-
"@theforeman/test": "^8.
|
34
|
-
"@theforeman/vendor-dev": "^
|
29
|
+
"@theforeman/builder": "^8.15.0",
|
30
|
+
"@theforeman/eslint-plugin-foreman": "^8.15.0",
|
31
|
+
"@theforeman/find-foreman": "^8.15.0",
|
32
|
+
"@theforeman/stories": "^8.15.0",
|
33
|
+
"@theforeman/test": "^8.15.0",
|
34
|
+
"@theforeman/vendor-dev": "^8.15.0",
|
35
35
|
"babel-eslint": "^10.0.3",
|
36
36
|
"eslint": "^6.7.2",
|
37
|
+
"jed": "^1.1.1",
|
37
38
|
"prettier": "^1.19.1",
|
38
39
|
"stylelint-config-standard": "^18.0.0",
|
39
40
|
"stylelint": "^9.3.0"
|
40
|
-
},
|
41
|
-
"dependencies": {
|
42
|
-
"jed": "^1.1.1",
|
43
|
-
"react-intl": "^2.8.0"
|
44
41
|
}
|
45
42
|
}
|
@@ -111,237 +111,6 @@ module ForemanPuppet
|
|
111
111
|
end
|
112
112
|
assert_response :success
|
113
113
|
end
|
114
|
-
|
115
|
-
describe 'POST #import_puppetclasses' do
|
116
|
-
# puppetmaster proxy - import_puppetclasses tests
|
117
|
-
|
118
|
-
let(:proxy) { FactoryBot.create(:puppet_smart_proxy) }
|
119
|
-
|
120
|
-
test 'should import new environments' do
|
121
|
-
setup_import_classes
|
122
|
-
as_admin do
|
123
|
-
Host::Managed.update_all(environment_id: nil)
|
124
|
-
Hostgroup.update_all(environment_id: nil)
|
125
|
-
Puppetclass.destroy_all
|
126
|
-
Environment.destroy_all
|
127
|
-
end
|
128
|
-
assert_difference('Environment.unscoped.count', 2) do
|
129
|
-
post :import_puppetclasses, params: { id: proxy.id }, session: set_session_user
|
130
|
-
end
|
131
|
-
assert_response :success
|
132
|
-
response = ActiveSupport::JSON.decode(@response.body)
|
133
|
-
assert_equal 2, response['environments_with_new_puppetclasses']
|
134
|
-
end
|
135
|
-
|
136
|
-
# this is intentional: put test_attributes only for the first generated test eg: dryrun_param = {}
|
137
|
-
test_attributes pid: '385efd1b-6146-47bf-babf-0127ce5955ed'
|
138
|
-
[{}, { dryrun: false }, { dryrun: 'false' }].each do |dryrun_param|
|
139
|
-
test 'should import new puppetclasses' do
|
140
|
-
setup_import_classes
|
141
|
-
as_admin do
|
142
|
-
Host::Managed.update_all(environment_id: nil)
|
143
|
-
Hostgroup.update_all(environment_id: nil)
|
144
|
-
Puppetclass.destroy_all
|
145
|
-
Environment.destroy_all
|
146
|
-
assert_difference(-> { ForemanPuppet::Puppetclass.unscoped.count }, 1) do
|
147
|
-
post :import_puppetclasses,
|
148
|
-
params: { id: proxy.id }.merge(dryrun_param),
|
149
|
-
session: set_session_user
|
150
|
-
end
|
151
|
-
end
|
152
|
-
assert_response :success
|
153
|
-
assert_match 'Successfully updated environment and puppetclasses from the on-disk puppet installation', @response.body
|
154
|
-
end
|
155
|
-
end
|
156
|
-
|
157
|
-
test 'should not import new puppetclasses when dryrun' do
|
158
|
-
setup_import_classes
|
159
|
-
as_admin do
|
160
|
-
Host::Managed.update_all(environment_id: nil)
|
161
|
-
Hostgroup.update_all(environment_id: nil)
|
162
|
-
Puppetclass.destroy_all
|
163
|
-
Environment.destroy_all
|
164
|
-
assert_difference(-> { ForemanPuppet::Puppetclass.unscoped.count }, 0) do
|
165
|
-
post :import_puppetclasses, params: { id: proxy.id, dryrun: true }, session: set_session_user
|
166
|
-
end
|
167
|
-
end
|
168
|
-
assert_response :success
|
169
|
-
end
|
170
|
-
|
171
|
-
test 'should obsolete environment' do
|
172
|
-
setup_import_classes
|
173
|
-
as_admin do
|
174
|
-
FactoryBot.create(:environment, name: 'xyz')
|
175
|
-
end
|
176
|
-
|
177
|
-
post :import_puppetclasses, params: { id: proxy.id }, session: set_session_user
|
178
|
-
assert_response :success
|
179
|
-
as_admin do
|
180
|
-
assert_nil ForemanPuppet::Environment.find_by(name: 'xyz')
|
181
|
-
end
|
182
|
-
end
|
183
|
-
|
184
|
-
test 'should obsolete puppetclasses' do
|
185
|
-
setup_import_classes
|
186
|
-
as_admin do
|
187
|
-
assert_difference(-> { ForemanPuppet::Environment.unscoped.find_by(name: 'env1').puppetclasses.count }, -2) do
|
188
|
-
post :import_puppetclasses, params: { id: proxy.id }, session: set_session_user
|
189
|
-
end
|
190
|
-
end
|
191
|
-
assert_response :success
|
192
|
-
end
|
193
|
-
|
194
|
-
test 'should update puppetclass smart class parameters' do
|
195
|
-
setup_import_classes
|
196
|
-
LookupKey.destroy_all
|
197
|
-
assert_difference(-> { LookupKey.unscoped.count }, 1) do
|
198
|
-
post :import_puppetclasses, params: { id: proxy.id }, session: set_session_user
|
199
|
-
end
|
200
|
-
assert_response :success
|
201
|
-
end
|
202
|
-
|
203
|
-
test 'no changes on import_puppetclasses' do
|
204
|
-
setup_import_classes
|
205
|
-
Puppetclass.find_by(name: 'b').destroy
|
206
|
-
Puppetclass.find_by(name: 'c').destroy
|
207
|
-
assert_difference(-> { ForemanPuppet::Environment.unscoped.count }, 0) do
|
208
|
-
post :import_puppetclasses, params: { id: proxy.id }, session: set_session_user
|
209
|
-
end
|
210
|
-
assert_response :success
|
211
|
-
response = ActiveSupport::JSON.decode(@response.body)
|
212
|
-
assert_equal 'Successfully updated environment and puppetclasses from the on-disk puppet installation', response['message']
|
213
|
-
end
|
214
|
-
|
215
|
-
test 'should import new environment that does not exist in db' do
|
216
|
-
setup_import_classes
|
217
|
-
as_admin do
|
218
|
-
env_name = 'env1'
|
219
|
-
assert Environment.find_by(name: env_name).destroy
|
220
|
-
assert_difference('Environment.unscoped.count', 1) do
|
221
|
-
post :import_puppetclasses, params: { id: proxy.id, environment_id: env_name }, session: set_session_user
|
222
|
-
end
|
223
|
-
assert_response :success
|
224
|
-
response = ActiveSupport::JSON.decode(@response.body)
|
225
|
-
assert_equal env_name, response['results']['name']
|
226
|
-
end
|
227
|
-
end
|
228
|
-
|
229
|
-
test 'should NOT delete environment if pass ?except=obsolete' do
|
230
|
-
setup_import_classes
|
231
|
-
as_admin do
|
232
|
-
Environment.create!(name: 'xyz')
|
233
|
-
end
|
234
|
-
assert_difference(-> { ForemanPuppet::Environment.unscoped.count }, 0) do
|
235
|
-
post :import_puppetclasses, params: { id: proxy.id, except: 'obsolete' }, session: set_session_user
|
236
|
-
end
|
237
|
-
assert_response :success
|
238
|
-
end
|
239
|
-
|
240
|
-
test 'should NOT add or update puppetclass smart class parameters if pass ?except=new,updated' do
|
241
|
-
setup_import_classes
|
242
|
-
LookupKey.destroy_all
|
243
|
-
assert_difference(-> { LookupKey.unscoped.count }, 0) do
|
244
|
-
post :import_puppetclasses, params: { id: proxy.id, except: 'new,updated' }, session: set_session_user
|
245
|
-
end
|
246
|
-
assert_response :success
|
247
|
-
end
|
248
|
-
|
249
|
-
context 'import puppetclasses' do
|
250
|
-
setup do
|
251
|
-
ProxyAPI::Puppet.any_instance.stubs(:environments).returns(%w[env1 env2])
|
252
|
-
classes_env1 = { 'a' => Foreman::ImporterPuppetclass.new('name' => 'a') }
|
253
|
-
classes_env2 = { 'b' => Foreman::ImporterPuppetclass.new('name' => 'b') }
|
254
|
-
ProxyAPI::Puppet.any_instance.stubs(:classes).returns(classes_env1.merge(classes_env2))
|
255
|
-
ProxyAPI::Puppet.any_instance.stubs(:classes).with('env1').returns(classes_env1)
|
256
|
-
ProxyAPI::Puppet.any_instance.stubs(:classes).with('env2').returns(classes_env2)
|
257
|
-
end
|
258
|
-
|
259
|
-
test 'should render templates according to api version 2' do
|
260
|
-
post :import_puppetclasses, params: { id: proxy.id }, session: set_session_user
|
261
|
-
assert_template 'foreman_puppet/api/v2/import_puppetclasses/index'
|
262
|
-
end
|
263
|
-
|
264
|
-
test 'should import puppetclasses for specified environment only' do
|
265
|
-
assert_difference(-> { ForemanPuppet::Puppetclass.unscoped.count }, 1) do
|
266
|
-
post :import_puppetclasses, params: { id: proxy.id, environment_id: 'env1' }, session: set_session_user
|
267
|
-
assert_includes Puppetclass.pluck(:name), 'a'
|
268
|
-
assert_not_includes Puppetclass.pluck(:name), 'b'
|
269
|
-
end
|
270
|
-
assert_response :success
|
271
|
-
end
|
272
|
-
|
273
|
-
test 'should import puppetclasses for all environments if none specified' do
|
274
|
-
assert_difference(-> { ForemanPuppet::Puppetclass.unscoped.count }, 2) do
|
275
|
-
post :import_puppetclasses, params: { id: proxy.id }, session: set_session_user
|
276
|
-
end
|
277
|
-
assert_includes Puppetclass.pluck(:name), 'a'
|
278
|
-
assert_includes Puppetclass.pluck(:name), 'b'
|
279
|
-
assert_response :success
|
280
|
-
end
|
281
|
-
|
282
|
-
context 'ignored entvironments or classes are set' do
|
283
|
-
setup do
|
284
|
-
setup_import_classes
|
285
|
-
end
|
286
|
-
|
287
|
-
test 'should contain ignored environments' do
|
288
|
-
env_name = 'env1'
|
289
|
-
PuppetClassImporter.any_instance.stubs(:ignored_environments).returns([env_name])
|
290
|
-
|
291
|
-
as_admin do
|
292
|
-
post :import_puppetclasses, params: { id: proxy.id }, session: set_session_user
|
293
|
-
assert_response :success
|
294
|
-
response = ActiveSupport::JSON.decode(@response.body)
|
295
|
-
assert_equal env_name, response['results'][0]['ignored_environment']
|
296
|
-
end
|
297
|
-
end
|
298
|
-
|
299
|
-
test 'should contain ignored puppet_classes' do
|
300
|
-
PuppetClassImporter.any_instance.stubs(:ignored_classes).returns([/^a$/])
|
301
|
-
|
302
|
-
as_admin do
|
303
|
-
post :import_puppetclasses, params: { id: proxy.id }, session: set_session_user
|
304
|
-
assert_response :success
|
305
|
-
response = ActiveSupport::JSON.decode(@response.body)
|
306
|
-
assert_includes response['results'][0]['ignored_puppetclasses'], 'a'
|
307
|
-
assert_not_includes response['results'][0]['ignored_puppetclasses'], 'c'
|
308
|
-
end
|
309
|
-
end
|
310
|
-
end
|
311
|
-
end
|
312
|
-
end
|
313
|
-
|
314
|
-
private
|
315
|
-
|
316
|
-
def setup_import_classes
|
317
|
-
as_admin do
|
318
|
-
::Host::Managed.update_all(environment_id: nil)
|
319
|
-
::Hostgroup.update_all(environment_id: nil)
|
320
|
-
ForemanPuppet::HostClass.destroy_all
|
321
|
-
ForemanPuppet::HostgroupClass.destroy_all
|
322
|
-
ForemanPuppet::Puppetclass.destroy_all
|
323
|
-
ForemanPuppet::Environment.destroy_all
|
324
|
-
end
|
325
|
-
orgs = [taxonomies(:organization1)]
|
326
|
-
locs = [taxonomies(:location1)]
|
327
|
-
# This is the database status
|
328
|
-
# and should result in a db_tree of {"env1" => ["a", "b", "c"], "env2" => ["a", "b", "c"]}
|
329
|
-
as_admin do
|
330
|
-
%w[a b c].each { |name| ForemanPuppet::Puppetclass.create name: name }
|
331
|
-
%w[env1 env2].each do |name|
|
332
|
-
e = ForemanPuppet::Environment.create!(name: name, organizations: orgs, locations: locs)
|
333
|
-
e.puppetclasses = ForemanPuppet::Puppetclass.all
|
334
|
-
end
|
335
|
-
end
|
336
|
-
# This is the on-disk status
|
337
|
-
# and should result in a disk_tree of {"env1" => ["a", "b", "c"],"env2" => ["a", "b", "c"]}
|
338
|
-
envs = HashWithIndifferentAccess.new(env1: %w[a b c], env2: %w[a b c])
|
339
|
-
pcs = [HashWithIndifferentAccess.new('a' => { 'name' => 'a', 'module' => nil, 'params' => { 'key' => 'special' } })]
|
340
|
-
classes = pcs.map { |k| [k.keys.first, Foreman::ImporterPuppetclass.new(k.values.first)] }.to_h
|
341
|
-
ForemanPuppet::Environment.expects(:puppetEnvs).returns(envs).at_least(0)
|
342
|
-
ProxyAPI::Puppet.any_instance.stubs(:environments).returns(%w[env1 env2])
|
343
|
-
ProxyAPI::Puppet.any_instance.stubs(:classes).returns(classes)
|
344
|
-
end
|
345
114
|
end
|
346
115
|
end
|
347
116
|
end
|
@@ -0,0 +1,255 @@
|
|
1
|
+
require 'test_puppet_helper'
|
2
|
+
|
3
|
+
module ForemanPuppet
|
4
|
+
module Api
|
5
|
+
module V2
|
6
|
+
class SmartProxiesControllerTest < ActionController::TestCase
|
7
|
+
tests ::Api::V2::SmartProxiesController
|
8
|
+
|
9
|
+
describe 'POST #import_puppetclasses' do
|
10
|
+
# puppetmaster proxy - import_puppetclasses tests
|
11
|
+
|
12
|
+
let(:proxy) { FactoryBot.create(:puppet_smart_proxy) }
|
13
|
+
|
14
|
+
test 'should import new environments' do
|
15
|
+
setup_import_classes
|
16
|
+
as_admin do
|
17
|
+
HostPuppetFacet.destroy_all
|
18
|
+
HostgroupPuppetFacet.destroy_all
|
19
|
+
Puppetclass.destroy_all
|
20
|
+
Environment.destroy_all
|
21
|
+
end
|
22
|
+
assert_difference('Environment.unscoped.count', 2) do
|
23
|
+
post :import_puppetclasses, params: { id: proxy.id }, session: set_session_user
|
24
|
+
end
|
25
|
+
assert_response :success
|
26
|
+
response = ActiveSupport::JSON.decode(@response.body)
|
27
|
+
assert_equal 2, response['environments_with_new_puppetclasses']
|
28
|
+
end
|
29
|
+
|
30
|
+
# this is intentional: put test_attributes only for the first generated test eg: dryrun_param = {}
|
31
|
+
test_attributes pid: '385efd1b-6146-47bf-babf-0127ce5955ed'
|
32
|
+
[{}, { dryrun: false }, { dryrun: 'false' }].each do |dryrun_param|
|
33
|
+
test 'should import new puppetclasses' do
|
34
|
+
setup_import_classes
|
35
|
+
as_admin do
|
36
|
+
HostPuppetFacet.destroy_all
|
37
|
+
HostgroupPuppetFacet.destroy_all
|
38
|
+
Puppetclass.destroy_all
|
39
|
+
Environment.destroy_all
|
40
|
+
assert_difference(-> { ForemanPuppet::Puppetclass.unscoped.count }, 1) do
|
41
|
+
post :import_puppetclasses,
|
42
|
+
params: { id: proxy.id }.merge(dryrun_param),
|
43
|
+
session: set_session_user
|
44
|
+
end
|
45
|
+
end
|
46
|
+
assert_response :success
|
47
|
+
assert_match 'Successfully updated environment and puppetclasses from the on-disk puppet installation', @response.body
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
test 'should not import new puppetclasses when dryrun' do
|
52
|
+
setup_import_classes
|
53
|
+
as_admin do
|
54
|
+
HostPuppetFacet.destroy_all
|
55
|
+
HostgroupPuppetFacet.destroy_all
|
56
|
+
Puppetclass.destroy_all
|
57
|
+
Environment.destroy_all
|
58
|
+
assert_difference(-> { ForemanPuppet::Puppetclass.unscoped.count }, 0) do
|
59
|
+
post :import_puppetclasses, params: { id: proxy.id, dryrun: true }, session: set_session_user
|
60
|
+
end
|
61
|
+
end
|
62
|
+
assert_response :success
|
63
|
+
end
|
64
|
+
|
65
|
+
test 'should obsolete environment' do
|
66
|
+
setup_import_classes
|
67
|
+
as_admin do
|
68
|
+
FactoryBot.create(:environment, name: 'xyz')
|
69
|
+
end
|
70
|
+
|
71
|
+
post :import_puppetclasses, params: { id: proxy.id }, session: set_session_user
|
72
|
+
assert_response :success
|
73
|
+
as_admin do
|
74
|
+
assert_nil ForemanPuppet::Environment.find_by(name: 'xyz')
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
test 'should obsolete puppetclasses' do
|
79
|
+
setup_import_classes
|
80
|
+
as_admin do
|
81
|
+
assert_difference(-> { ForemanPuppet::Environment.unscoped.find_by(name: 'env1').puppetclasses.count }, -2) do
|
82
|
+
post :import_puppetclasses, params: { id: proxy.id }, session: set_session_user
|
83
|
+
end
|
84
|
+
end
|
85
|
+
assert_response :success
|
86
|
+
end
|
87
|
+
|
88
|
+
test 'should update puppetclass smart class parameters' do
|
89
|
+
setup_import_classes
|
90
|
+
LookupKey.destroy_all
|
91
|
+
assert_difference(-> { LookupKey.unscoped.count }, 1) do
|
92
|
+
post :import_puppetclasses, params: { id: proxy.id }, session: set_session_user
|
93
|
+
end
|
94
|
+
assert_response :success
|
95
|
+
end
|
96
|
+
|
97
|
+
test 'no changes on import_puppetclasses' do
|
98
|
+
setup_import_classes
|
99
|
+
Puppetclass.find_by(name: 'b').destroy
|
100
|
+
Puppetclass.find_by(name: 'c').destroy
|
101
|
+
assert_difference(-> { ForemanPuppet::Environment.unscoped.count }, 0) do
|
102
|
+
post :import_puppetclasses, params: { id: proxy.id }, session: set_session_user
|
103
|
+
end
|
104
|
+
assert_response :success
|
105
|
+
response = ActiveSupport::JSON.decode(@response.body)
|
106
|
+
assert_equal 'Successfully updated environment and puppetclasses from the on-disk puppet installation', response['message']
|
107
|
+
end
|
108
|
+
|
109
|
+
test 'should import new environment that does not exist in db' do
|
110
|
+
setup_import_classes
|
111
|
+
as_admin do
|
112
|
+
env_name = 'env1'
|
113
|
+
assert Environment.find_by(name: env_name).destroy
|
114
|
+
assert_difference('Environment.unscoped.count', 1) do
|
115
|
+
post :import_puppetclasses, params: { id: proxy.id, environment_id: env_name }, session: set_session_user
|
116
|
+
end
|
117
|
+
assert_response :success
|
118
|
+
response = ActiveSupport::JSON.decode(@response.body)
|
119
|
+
assert_equal env_name, response['results']['name']
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
test 'should NOT delete environment if pass ?except=obsolete' do
|
124
|
+
setup_import_classes
|
125
|
+
as_admin do
|
126
|
+
Environment.create!(name: 'xyz')
|
127
|
+
end
|
128
|
+
assert_difference(-> { ForemanPuppet::Environment.unscoped.count }, 0) do
|
129
|
+
post :import_puppetclasses, params: { id: proxy.id, except: 'obsolete' }, session: set_session_user
|
130
|
+
end
|
131
|
+
assert_response :success
|
132
|
+
end
|
133
|
+
|
134
|
+
test 'should NOT add or update puppetclass smart class parameters if pass ?except=new,updated' do
|
135
|
+
setup_import_classes
|
136
|
+
LookupKey.destroy_all
|
137
|
+
assert_difference(-> { LookupKey.unscoped.count }, 0) do
|
138
|
+
post :import_puppetclasses, params: { id: proxy.id, except: 'new,updated' }, session: set_session_user
|
139
|
+
end
|
140
|
+
assert_response :success
|
141
|
+
end
|
142
|
+
|
143
|
+
context 'import puppetclasses' do
|
144
|
+
setup do
|
145
|
+
ProxyAPI::Puppet.any_instance.stubs(:environments).returns(%w[env1 env2])
|
146
|
+
classes_env1 = { 'a' => Foreman::ImporterPuppetclass.new('name' => 'a') }
|
147
|
+
classes_env2 = { 'b' => Foreman::ImporterPuppetclass.new('name' => 'b') }
|
148
|
+
|
149
|
+
ProxyAPI::Puppet.any_instance.stubs(:classes).with('invalid').returns({})
|
150
|
+
ProxyAPI::Puppet.any_instance.stubs(:classes).with('env1').returns(classes_env1)
|
151
|
+
ProxyAPI::Puppet.any_instance.stubs(:classes).with('env2').returns(classes_env2)
|
152
|
+
end
|
153
|
+
|
154
|
+
test 'should render templates according to api version 2' do
|
155
|
+
post :import_puppetclasses, params: { id: proxy.id }, session: set_session_user
|
156
|
+
assert_template 'foreman_puppet/api/v2/import_puppetclasses/index'
|
157
|
+
end
|
158
|
+
|
159
|
+
test 'should import puppetclasses for specified environment only' do
|
160
|
+
assert_difference(-> { ForemanPuppet::Puppetclass.unscoped.count }, 1) do
|
161
|
+
post :import_puppetclasses, params: { id: proxy.id, environment_id: 'env1' }, session: set_session_user
|
162
|
+
assert_includes Puppetclass.pluck(:name), 'a'
|
163
|
+
assert_not_includes Puppetclass.pluck(:name), 'b'
|
164
|
+
end
|
165
|
+
assert_response :success
|
166
|
+
end
|
167
|
+
|
168
|
+
test 'should render error message when invalid environment is set' do
|
169
|
+
env = 'invalid'
|
170
|
+
assert_difference(-> { ForemanPuppet::Puppetclass.unscoped.count }, 0) do
|
171
|
+
post :import_puppetclasses, params: { id: proxy.id, environment_id: env }, session: set_session_user
|
172
|
+
assert_not_includes Puppetclass.pluck(:name), 'a'
|
173
|
+
assert_not_includes Puppetclass.pluck(:name), 'b'
|
174
|
+
end
|
175
|
+
response = ActiveSupport::JSON.decode(@response.body)
|
176
|
+
assert_equal 'The requested environment cannot be found.', response['message']
|
177
|
+
assert_response :success
|
178
|
+
end
|
179
|
+
|
180
|
+
test 'should import puppetclasses for all environments if none specified' do
|
181
|
+
assert_difference(-> { ForemanPuppet::Puppetclass.unscoped.count }, 2) do
|
182
|
+
post :import_puppetclasses, params: { id: proxy.id }, session: set_session_user
|
183
|
+
end
|
184
|
+
assert_includes Puppetclass.pluck(:name), 'a'
|
185
|
+
assert_includes Puppetclass.pluck(:name), 'b'
|
186
|
+
assert_response :success
|
187
|
+
end
|
188
|
+
|
189
|
+
context 'ignored environments or classes are set' do
|
190
|
+
setup do
|
191
|
+
setup_import_classes
|
192
|
+
end
|
193
|
+
|
194
|
+
test 'should contain ignored environments' do
|
195
|
+
env_name = 'env1'
|
196
|
+
PuppetClassImporter.any_instance.stubs(:ignored_environments).returns([env_name])
|
197
|
+
|
198
|
+
as_admin do
|
199
|
+
post :import_puppetclasses, params: { id: proxy.id }, session: set_session_user
|
200
|
+
assert_response :success
|
201
|
+
response = ActiveSupport::JSON.decode(@response.body)
|
202
|
+
assert_equal env_name, response['results'][0]['ignored_environment']
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
206
|
+
test 'should contain ignored puppet_classes' do
|
207
|
+
PuppetClassImporter.any_instance.stubs(:ignored_classes).returns([/^a$/])
|
208
|
+
|
209
|
+
as_admin do
|
210
|
+
post :import_puppetclasses, params: { id: proxy.id }, session: set_session_user
|
211
|
+
assert_response :success
|
212
|
+
response = ActiveSupport::JSON.decode(@response.body)
|
213
|
+
assert_includes response['results'][0]['ignored_puppetclasses'], 'a'
|
214
|
+
assert_not_includes response['results'][0]['ignored_puppetclasses'], 'c'
|
215
|
+
end
|
216
|
+
end
|
217
|
+
end
|
218
|
+
end
|
219
|
+
end
|
220
|
+
|
221
|
+
private
|
222
|
+
|
223
|
+
def setup_import_classes
|
224
|
+
as_admin do
|
225
|
+
HostPuppetFacet.destroy_all
|
226
|
+
HostgroupPuppetFacet.destroy_all
|
227
|
+
ForemanPuppet::HostClass.destroy_all
|
228
|
+
ForemanPuppet::HostgroupClass.destroy_all
|
229
|
+
ForemanPuppet::Puppetclass.destroy_all
|
230
|
+
ForemanPuppet::Environment.destroy_all
|
231
|
+
end
|
232
|
+
orgs = [taxonomies(:organization1)]
|
233
|
+
locs = [taxonomies(:location1)]
|
234
|
+
# This is the database status
|
235
|
+
# and should result in a db_tree of {"env1" => ["a", "b", "c"], "env2" => ["a", "b", "c"]}
|
236
|
+
as_admin do
|
237
|
+
%w[a b c].each { |name| ForemanPuppet::Puppetclass.create name: name }
|
238
|
+
%w[env1 env2].each do |name|
|
239
|
+
e = ForemanPuppet::Environment.create!(name: name, organizations: orgs, locations: locs)
|
240
|
+
e.puppetclasses = ForemanPuppet::Puppetclass.all
|
241
|
+
end
|
242
|
+
end
|
243
|
+
# This is the on-disk status
|
244
|
+
# and should result in a disk_tree of {"env1" => ["a", "b", "c"],"env2" => ["a", "b", "c"]}
|
245
|
+
envs = HashWithIndifferentAccess.new(env1: %w[a b c], env2: %w[a b c])
|
246
|
+
pcs = [HashWithIndifferentAccess.new('a' => { 'name' => 'a', 'module' => nil, 'params' => { 'key' => 'special' } })]
|
247
|
+
classes = pcs.map { |k| [k.keys.first, Foreman::ImporterPuppetclass.new(k.values.first)] }.to_h
|
248
|
+
ForemanPuppet::Environment.expects(:puppetEnvs).returns(envs).at_least(0)
|
249
|
+
ProxyAPI::Puppet.any_instance.stubs(:environments).returns(%w[env1 env2])
|
250
|
+
ProxyAPI::Puppet.any_instance.stubs(:classes).returns(classes)
|
251
|
+
end
|
252
|
+
end
|
253
|
+
end
|
254
|
+
end
|
255
|
+
end
|
@@ -194,8 +194,8 @@ module ForemanPuppet
|
|
194
194
|
|
195
195
|
def setup_import_classes
|
196
196
|
as_admin do
|
197
|
-
|
198
|
-
|
197
|
+
HostPuppetFacet.destroy_all
|
198
|
+
HostgroupPuppetFacet.destroy_all
|
199
199
|
Puppetclass.destroy_all
|
200
200
|
Environment.destroy_all
|
201
201
|
end
|