foreman_rh_cloud 3.0.24.1 → 3.0.29

Sign up to get free protection for your applications and to get access to all the features.
Files changed (30) hide show
  1. checksums.yaml +4 -4
  2. data/app/services/foreman_rh_cloud/cloud_auth.rb +4 -0
  3. data/app/services/foreman_rh_cloud/cloud_request_forwarder.rb +10 -0
  4. data/app/services/foreman_rh_cloud/remediations_retriever.rb +5 -0
  5. data/config/Gemfile.lock.gh_test +93 -95
  6. data/config/database.yml.example +2 -2
  7. data/config/routes.rb +1 -1
  8. data/lib/foreman_inventory_upload/generators/tags.rb +3 -1
  9. data/lib/foreman_rh_cloud/version.rb +1 -1
  10. data/lib/foreman_rh_cloud.rb +12 -1
  11. data/lib/insights_cloud/async/insights_full_sync.rb +5 -0
  12. data/lib/insights_cloud/async/insights_resolutions_sync.rb +12 -2
  13. data/lib/insights_cloud/async/insights_rules_sync.rb +11 -2
  14. data/lib/inventory_sync/async/host_result.rb +0 -5
  15. data/lib/inventory_sync/async/inventory_full_sync.rb +19 -9
  16. data/lib/inventory_sync/async/inventory_hosts_sync.rb +7 -6
  17. data/lib/inventory_sync/async/inventory_self_host_sync.rb +9 -0
  18. data/package.json +3 -3
  19. data/test/jobs/insights_full_sync_test.rb +1 -0
  20. data/test/jobs/insights_resolutions_sync_test.rb +11 -1
  21. data/test/jobs/insights_rules_sync_test.rb +1 -0
  22. data/test/jobs/inventory_full_sync_test.rb +38 -2
  23. data/test/jobs/inventory_hosts_sync_test.rb +16 -0
  24. data/test/jobs/inventory_self_host_sync_test.rb +1 -0
  25. data/test/unit/foreman_rh_cloud_self_host_test.rb +28 -0
  26. data/test/unit/services/foreman_rh_cloud/cloud_request_forwarder_test.rb +1 -0
  27. data/test/unit/services/foreman_rh_cloud/template_renderer_helper_test.rb +1 -0
  28. data/test/unit/tags_generator_test.rb +41 -0
  29. data/webpack/InsightsCloudSync/Components/RemediationModal/RemediationModal.scss +14 -0
  30. metadata +5 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0157c9f96dcbfa67895f62e292af8f9171c6d90a60f3eb8fdca5de57bd42918c
4
- data.tar.gz: 24c8de05e245d54d789bacbed59bf7bd8c85d40f7252a59b60b599ab8941f5e9
3
+ metadata.gz: a50f0107b0ee371ca53cac0aa1cc4efcb4cddb0e71682812fcf14b035298a635
4
+ data.tar.gz: 90a60ab9b0ad34c6f2afd16f6f1f896352f274fa375151232744c2fae9535430
5
5
  SHA512:
6
- metadata.gz: cd9e22b6176184b7c40d64229170458a59d2e70fbca128b892d299359c3e531afae0ebf760d07f57ba304bc042d86a601ef13472e8e8c3686eb670620185ee70
7
- data.tar.gz: ca49d14fb99c6de0480cf180b1f38d7a70cca26808ef141cc6c504fbfc08daeda3f89127def3cc18e6d8ed2afbef835704d48ef4011442b33f7ec407def79fea
6
+ metadata.gz: f6b5ef45a9aaec31e4507245426ec4dd5a27d1cd91ac5df66b5240d9554a3e2282d3f9d2ffb9fbbe0f8ddedcef1e856d31b3dab64ca7da073bf6b61c1cf3b473
7
+ data.tar.gz: 032f6945342c0bd9868234006b5b50f24986c4397be70152e73a05fb468e725314a768c48bd4c2eb6cf996ed161d035a60c5e45b549e489417e8c691ece43883
@@ -4,6 +4,10 @@ module ForemanRhCloud
4
4
 
5
5
  include CloudRequest
6
6
 
7
+ def cloud_auth_available?
8
+ Setting[:rh_cloud_token].present?
9
+ end
10
+
7
11
  def rh_credentials
8
12
  @rh_credentials ||= query_refresh_token
9
13
  end
@@ -62,6 +62,12 @@ module ForemanRhCloud
62
62
  ssl_client_cert: OpenSSL::X509::Certificate.new(certs[:cert]),
63
63
  ssl_client_key: OpenSSL::PKey::RSA.new(certs[:key]),
64
64
  }
65
+ when connection_test_request?
66
+ {
67
+ url: ForemanRhCloud.cert_base_url + '/api/apicast-tests/ping',
68
+ ssl_client_cert: OpenSSL::X509::Certificate.new(certs[:cert]),
69
+ ssl_client_key: OpenSSL::PKey::RSA.new(certs[:key]),
70
+ }
65
71
  else # Legacy insights API
66
72
  {
67
73
  url: ForemanRhCloud.legacy_insights_url + request_path.sub('/redhat_access/r/insights', '/r/insights'),
@@ -76,6 +82,10 @@ module ForemanRhCloud
76
82
  ->(request_path) { request_path.include? '/platform' }
77
83
  end
78
84
 
85
+ def connection_test_request?
86
+ ->(request_path) { request_path =~ /redhat_access\/r\/insights\/?$/ }
87
+ end
88
+
79
89
  def prepare_forward_cloud_url(base_url, request_path)
80
90
  cloud_path = request_path.sub('/redhat_access/r/insights/platform/', '')
81
91
  .sub('/redhat_access/r/insights/', '')
@@ -12,6 +12,11 @@ module ForemanRhCloud
12
12
  end
13
13
 
14
14
  def create_playbook
15
+ unless cloud_auth_available?
16
+ logger.debug('Cloud authentication is not available, cannot continue')
17
+ return
18
+ end
19
+
15
20
  response = query_playbook
16
21
 
17
22
  logger.debug("Got playbook response: #{response.body}")
@@ -9,27 +9,27 @@ PATH
9
9
  PATH
10
10
  remote: ../katello
11
11
  specs:
12
- katello (3.18.0.rc1)
12
+ katello (3.18.3.1)
13
13
  activerecord-import
14
14
  anemone
15
15
  angular-rails-templates (~> 1.1.0)
16
16
  apipie-rails (>= 0.5.14)
17
17
  deface (>= 1.0.2, < 2.0.0)
18
18
  dynflow (>= 1.2.0)
19
- foreman-tasks (>= 0.14.1)
19
+ foreman-tasks (>= 0.14.1, < 4.0)
20
20
  foreman_remote_execution (>= 3.0)
21
21
  fx (< 1.0)
22
22
  gettext_i18n_rails
23
23
  json
24
24
  oauth
25
25
  pg
26
- pulp_2to3_migration_client (>= 0.3.0, < 0.6.0, != 0.4.0)
26
+ pulp_2to3_migration_client (>= 0.8.0, < 1.0.0)
27
27
  pulp_ansible_client (>= 0.2, < 0.5)
28
28
  pulp_certguard_client (< 2.0)
29
29
  pulp_container_client (>= 2.0.0, < 2.2.0)
30
30
  pulp_deb_client (>= 2.6.0, < 2.8.0)
31
31
  pulp_file_client (>= 1.2.0, < 1.4.0)
32
- pulp_rpm_client (>= 3.6.2, < 3.8.0)
32
+ pulp_rpm_client (>= 3.10.0, < 3.11.0)
33
33
  pulpcore_client (>= 3.6.0, < 3.8.0)
34
34
  rabl
35
35
  rails
@@ -41,51 +41,51 @@ PATH
41
41
  GEM
42
42
  remote: https://rubygems.org/
43
43
  specs:
44
- actioncable (6.0.3.4)
45
- actionpack (= 6.0.3.4)
44
+ actioncable (6.0.3.6)
45
+ actionpack (= 6.0.3.6)
46
46
  nio4r (~> 2.0)
47
47
  websocket-driver (>= 0.6.1)
48
- actionmailbox (6.0.3.4)
49
- actionpack (= 6.0.3.4)
50
- activejob (= 6.0.3.4)
51
- activerecord (= 6.0.3.4)
52
- activestorage (= 6.0.3.4)
53
- activesupport (= 6.0.3.4)
48
+ actionmailbox (6.0.3.6)
49
+ actionpack (= 6.0.3.6)
50
+ activejob (= 6.0.3.6)
51
+ activerecord (= 6.0.3.6)
52
+ activestorage (= 6.0.3.6)
53
+ activesupport (= 6.0.3.6)
54
54
  mail (>= 2.7.1)
55
- actionmailer (6.0.3.4)
56
- actionpack (= 6.0.3.4)
57
- actionview (= 6.0.3.4)
58
- activejob (= 6.0.3.4)
55
+ actionmailer (6.0.3.6)
56
+ actionpack (= 6.0.3.6)
57
+ actionview (= 6.0.3.6)
58
+ activejob (= 6.0.3.6)
59
59
  mail (~> 2.5, >= 2.5.4)
60
60
  rails-dom-testing (~> 2.0)
61
- actionpack (6.0.3.4)
62
- actionview (= 6.0.3.4)
63
- activesupport (= 6.0.3.4)
61
+ actionpack (6.0.3.6)
62
+ actionview (= 6.0.3.6)
63
+ activesupport (= 6.0.3.6)
64
64
  rack (~> 2.0, >= 2.0.8)
65
65
  rack-test (>= 0.6.3)
66
66
  rails-dom-testing (~> 2.0)
67
67
  rails-html-sanitizer (~> 1.0, >= 1.2.0)
68
- actiontext (6.0.3.4)
69
- actionpack (= 6.0.3.4)
70
- activerecord (= 6.0.3.4)
71
- activestorage (= 6.0.3.4)
72
- activesupport (= 6.0.3.4)
68
+ actiontext (6.0.3.6)
69
+ actionpack (= 6.0.3.6)
70
+ activerecord (= 6.0.3.6)
71
+ activestorage (= 6.0.3.6)
72
+ activesupport (= 6.0.3.6)
73
73
  nokogiri (>= 1.8.5)
74
- actionview (6.0.3.4)
75
- activesupport (= 6.0.3.4)
74
+ actionview (6.0.3.6)
75
+ activesupport (= 6.0.3.6)
76
76
  builder (~> 3.1)
77
77
  erubi (~> 1.4)
78
78
  rails-dom-testing (~> 2.0)
79
79
  rails-html-sanitizer (~> 1.1, >= 1.2.0)
80
- activejob (6.0.3.4)
81
- activesupport (= 6.0.3.4)
80
+ activejob (6.0.3.6)
81
+ activesupport (= 6.0.3.6)
82
82
  globalid (>= 0.3.6)
83
- activemodel (6.0.3.4)
84
- activesupport (= 6.0.3.4)
85
- activerecord (6.0.3.4)
86
- activemodel (= 6.0.3.4)
87
- activesupport (= 6.0.3.4)
88
- activerecord-import (1.0.7)
83
+ activemodel (6.0.3.6)
84
+ activesupport (= 6.0.3.6)
85
+ activerecord (6.0.3.6)
86
+ activemodel (= 6.0.3.6)
87
+ activesupport (= 6.0.3.6)
88
+ activerecord-import (1.1.0)
89
89
  activerecord (>= 3.2)
90
90
  activerecord-nulldb-adapter (0.7.0)
91
91
  activerecord (>= 5.2.0, < 6.3)
@@ -95,12 +95,12 @@ GEM
95
95
  multi_json (~> 1.11, >= 1.11.2)
96
96
  rack (>= 1.5.2, < 3)
97
97
  railties (>= 4.0)
98
- activestorage (6.0.3.4)
99
- actionpack (= 6.0.3.4)
100
- activejob (= 6.0.3.4)
101
- activerecord (= 6.0.3.4)
102
- marcel (~> 0.3.1)
103
- activesupport (6.0.3.4)
98
+ activestorage (6.0.3.6)
99
+ actionpack (= 6.0.3.6)
100
+ activejob (= 6.0.3.6)
101
+ activerecord (= 6.0.3.6)
102
+ marcel (~> 1.0.0)
103
+ activesupport (6.0.3.6)
104
104
  concurrent-ruby (~> 1.0, >= 1.0.2)
105
105
  i18n (>= 0.7, < 2)
106
106
  minitest (~> 5.1)
@@ -109,7 +109,7 @@ GEM
109
109
  addressable (2.7.0)
110
110
  public_suffix (>= 2.0.2, < 5.0)
111
111
  algebrick (0.7.5)
112
- amazing_print (1.2.2)
112
+ amazing_print (1.3.0)
113
113
  ancestry (3.2.1)
114
114
  activerecord (>= 4.2.0)
115
115
  anemone (0.7.2)
@@ -134,15 +134,15 @@ GEM
134
134
  execjs
135
135
  bcrypt (3.1.16)
136
136
  benchmark-ips (2.8.4)
137
- binding_of_caller (1.0.0)
137
+ binding_of_caller (0.8.0)
138
138
  debug_inspector (>= 0.0.1)
139
- bootsnap (1.7.1)
139
+ bootsnap (1.7.3)
140
140
  msgpack (~> 1.0)
141
141
  bootstrap-sass (3.4.1)
142
142
  autoprefixer-rails (>= 5.2.1)
143
143
  sassc (>= 2.0.0)
144
144
  builder (3.2.4)
145
- bullet (6.1.3)
145
+ bullet (6.1.4)
146
146
  activesupport (>= 3.0.0)
147
147
  uniform_notifier (~> 1.11)
148
148
  byebug (11.1.3)
@@ -180,12 +180,12 @@ GEM
180
180
  daemons (1.3.1)
181
181
  database_cleaner (1.99.0)
182
182
  deacon (1.0.0)
183
- debug_inspector (1.0.0)
183
+ debug_inspector (1.1.0)
184
184
  declarative (0.0.20)
185
185
  declarative-option (0.1.0)
186
- deep_cloneable (3.0.0)
186
+ deep_cloneable (3.1.0)
187
187
  activerecord (>= 3.1.0, < 7)
188
- deface (1.6.1)
188
+ deface (1.8.1)
189
189
  nokogiri (>= 1.6)
190
190
  polyglot
191
191
  rails (>= 5.2)
@@ -193,7 +193,7 @@ GEM
193
193
  docile (1.3.5)
194
194
  domain_name (0.5.20190701)
195
195
  unf (>= 0.0.5, < 1.0.0)
196
- dynflow (1.4.7)
196
+ dynflow (1.5.0)
197
197
  algebrick (~> 0.7.0)
198
198
  apipie-params
199
199
  concurrent-ruby (~> 1.1.3)
@@ -203,7 +203,7 @@ GEM
203
203
  erubi (1.10.0)
204
204
  excon (0.79.0)
205
205
  execjs (2.7.0)
206
- facter (4.0.50)
206
+ facter (4.0.52)
207
207
  hocon (~> 1.3)
208
208
  thor (>= 1.0.1, < 2.0)
209
209
  factory_bot (5.2.0)
@@ -270,7 +270,7 @@ GEM
270
270
  sinatra
271
271
  foreman-tasks-core (0.3.4)
272
272
  dynflow (>= 1.2.0)
273
- foreman_ansible (6.1.1)
273
+ foreman_ansible (6.2.0)
274
274
  deface (< 2.0)
275
275
  foreman_remote_execution (>= 4.2.0)
276
276
  ipaddress (>= 0.8.0, < 1.0)
@@ -338,7 +338,7 @@ GEM
338
338
  http-cookie (1.0.3)
339
339
  domain_name (~> 0.5)
340
340
  httpclient (2.8.3)
341
- i18n (1.8.8)
341
+ i18n (1.8.10)
342
342
  concurrent-ruby (~> 1.0)
343
343
  immigrant (0.3.6)
344
344
  activerecord (>= 3.0)
@@ -369,16 +369,14 @@ GEM
369
369
  nokogiri (>= 1.5.9)
370
370
  mail (2.7.1)
371
371
  mini_mime (>= 0.1.1)
372
- marcel (0.3.3)
373
- mimemagic (~> 0.3.2)
372
+ marcel (1.0.0)
374
373
  maruku (0.7.3)
375
374
  memoist (0.16.2)
376
375
  method_source (1.0.0)
377
376
  mime-types (3.3.1)
378
377
  mime-types-data (~> 3.2015)
379
- mime-types-data (3.2020.1104)
380
- mimemagic (0.3.5)
381
- mini_mime (1.0.2)
378
+ mime-types-data (3.2021.0225)
379
+ mini_mime (1.0.3)
382
380
  mini_portile2 (2.5.0)
383
381
  minitest (5.10.3)
384
382
  minitest-reporters (1.4.3)
@@ -404,8 +402,8 @@ GEM
404
402
  net-ssh (>= 2.6.5, < 7.0.0)
405
403
  net-ssh (4.2.0)
406
404
  netrc (0.11.0)
407
- nio4r (2.5.5)
408
- nokogiri (1.11.1)
405
+ nio4r (2.5.7)
406
+ nokogiri (1.11.2)
409
407
  mini_portile2 (~> 2.5.0)
410
408
  racc (~> 1.4)
411
409
  oauth (0.5.5)
@@ -415,10 +413,10 @@ GEM
415
413
  json (>= 1, < 3)
416
414
  paint (2.2.1)
417
415
  parallel (1.20.1)
418
- parallel_tests (3.4.0)
416
+ parallel_tests (3.6.0)
419
417
  parallel
420
418
  parse-cron (0.1.4)
421
- parser (3.0.0.0)
419
+ parser (3.0.1.1)
422
420
  ast (~> 2.4.1)
423
421
  patternfly-sass (3.59.5)
424
422
  bootstrap-sass (~> 3.4.0)
@@ -430,12 +428,12 @@ GEM
430
428
  polyglot (0.3.5)
431
429
  prometheus-client (1.0.0)
432
430
  promise.rb (0.7.4)
433
- pry (0.13.1)
431
+ pry (0.14.0)
434
432
  coderay (~> 1.1)
435
433
  method_source (~> 1.0)
436
- pry-byebug (3.9.0)
434
+ pry-byebug (3.8.0)
437
435
  byebug (~> 11.0)
438
- pry (~> 0.13.0)
436
+ pry (~> 0.10)
439
437
  pry-doc (1.1.0)
440
438
  pry (~> 0.11)
441
439
  yard (~> 0.9.11)
@@ -444,20 +442,20 @@ GEM
444
442
  pry-remote (0.1.8)
445
443
  pry (~> 0.9)
446
444
  slop (~> 3.0)
447
- pry-stack_explorer (0.6.0)
448
- binding_of_caller (~> 1.0)
445
+ pry-stack_explorer (0.4.13)
446
+ binding_of_caller (~> 0.7)
449
447
  pry (~> 0.13)
450
448
  public_suffix (4.0.6)
451
- pulp_2to3_migration_client (0.5.1)
449
+ pulp_2to3_migration_client (0.11.2)
452
450
  faraday (>= 0.14.0)
453
451
  json (~> 2.1, >= 2.1.0)
454
452
  pulp_ansible_client (0.4.3)
455
453
  faraday (>= 0.14.0)
456
454
  json (~> 2.1, >= 2.1.0)
457
- pulp_certguard_client (1.1.0)
455
+ pulp_certguard_client (1.3.0)
458
456
  faraday (>= 0.14.0)
459
457
  json (~> 2.1, >= 2.1.0)
460
- pulp_container_client (2.1.0)
458
+ pulp_container_client (2.1.2)
461
459
  faraday (>= 0.14.0)
462
460
  json (~> 2.1, >= 2.1.0)
463
461
  pulp_deb_client (2.7.0)
@@ -466,13 +464,13 @@ GEM
466
464
  pulp_file_client (1.3.0)
467
465
  faraday (>= 0.14.0)
468
466
  json (~> 2.1, >= 2.1.0)
469
- pulp_rpm_client (3.7.0)
467
+ pulp_rpm_client (3.10.0)
470
468
  faraday (>= 0.14.0)
471
469
  json (~> 2.1, >= 2.1.0)
472
- pulpcore_client (3.7.3)
470
+ pulpcore_client (3.7.6)
473
471
  faraday (>= 0.14.0)
474
472
  json (~> 2.1, >= 2.1.0)
475
- puma (4.3.7)
473
+ puma (4.3.8)
476
474
  nio4r (~> 2.0)
477
475
  puma-plugin-systemd (0.1.5)
478
476
  json
@@ -492,20 +490,20 @@ GEM
492
490
  rack
493
491
  rack-test (1.1.0)
494
492
  rack (>= 1.0, < 3)
495
- rails (6.0.3.4)
496
- actioncable (= 6.0.3.4)
497
- actionmailbox (= 6.0.3.4)
498
- actionmailer (= 6.0.3.4)
499
- actionpack (= 6.0.3.4)
500
- actiontext (= 6.0.3.4)
501
- actionview (= 6.0.3.4)
502
- activejob (= 6.0.3.4)
503
- activemodel (= 6.0.3.4)
504
- activerecord (= 6.0.3.4)
505
- activestorage (= 6.0.3.4)
506
- activesupport (= 6.0.3.4)
493
+ rails (6.0.3.6)
494
+ actioncable (= 6.0.3.6)
495
+ actionmailbox (= 6.0.3.6)
496
+ actionmailer (= 6.0.3.6)
497
+ actionpack (= 6.0.3.6)
498
+ actiontext (= 6.0.3.6)
499
+ actionview (= 6.0.3.6)
500
+ activejob (= 6.0.3.6)
501
+ activemodel (= 6.0.3.6)
502
+ activerecord (= 6.0.3.6)
503
+ activestorage (= 6.0.3.6)
504
+ activesupport (= 6.0.3.6)
507
505
  bundler (>= 1.3.0)
508
- railties (= 6.0.3.4)
506
+ railties (= 6.0.3.6)
509
507
  sprockets-rails (>= 2.0.0)
510
508
  rails-controller-testing (1.0.5)
511
509
  actionpack (>= 5.0.1.rc1)
@@ -519,9 +517,9 @@ GEM
519
517
  rails-i18n (6.0.0)
520
518
  i18n (>= 0.7, < 2)
521
519
  railties (>= 6.0.0, < 7)
522
- railties (6.0.3.4)
523
- actionpack (= 6.0.3.4)
524
- activesupport (= 6.0.3.4)
520
+ railties (6.0.3.6)
521
+ actionpack (= 6.0.3.6)
522
+ activesupport (= 6.0.3.6)
525
523
  method_source
526
524
  rake (>= 0.8.7)
527
525
  thor (>= 0.20.3, < 2.0)
@@ -541,7 +539,7 @@ GEM
541
539
  rdoc (6.3.0)
542
540
  record_tag_helper (1.0.1)
543
541
  actionview (>= 5)
544
- redhat_access (2.2.18)
542
+ redhat_access (2.2.20)
545
543
  angular-rails-templates (>= 0.0.4)
546
544
  foreman-tasks
547
545
  katello
@@ -563,7 +561,7 @@ GEM
563
561
  mime-types (>= 1.16, < 4.0)
564
562
  netrc (~> 0.8)
565
563
  retriable (3.1.2)
566
- rexml (3.2.4)
564
+ rexml (3.2.5)
567
565
  rfauxfactory (0.1.5)
568
566
  roadie (4.0.0)
569
567
  css_parser (~> 1.4)
@@ -628,12 +626,12 @@ GEM
628
626
  tilt
629
627
  scoped_search (4.1.9)
630
628
  activerecord (>= 4.2.0)
631
- sd_notify (0.1.0)
632
- secure_headers (6.3.1)
629
+ sd_notify (0.1.1)
630
+ secure_headers (6.3.2)
633
631
  selenium-webdriver (3.142.7)
634
632
  childprocess (>= 0.5, < 4.0)
635
633
  rubyzip (>= 1.2.2)
636
- sequel (5.41.0)
634
+ sequel (5.45.0)
637
635
  sexp_processor (4.15.2)
638
636
  shoulda-context (1.2.2)
639
637
  shoulda-matchers (4.3.0)
@@ -645,7 +643,7 @@ GEM
645
643
  rack (~> 2.0)
646
644
  rack-protection (>= 1.5.0)
647
645
  redis (>= 3.3.5, < 4.2)
648
- signet (0.14.1)
646
+ signet (0.15.0)
649
647
  addressable (~> 2.3)
650
648
  faraday (>= 0.17.3, < 2.0)
651
649
  jwt (>= 1.5, < 3.0)
@@ -690,11 +688,11 @@ GEM
690
688
  unf_ext
691
689
  unf_ext (0.0.7.7)
692
690
  unicode-display_width (1.6.1)
693
- uniform_notifier (1.13.2)
691
+ uniform_notifier (1.14.2)
694
692
  validates_lengths_from_database (0.8.0)
695
693
  activerecord (>= 4)
696
694
  vcr (3.0.3)
697
- webmock (3.11.2)
695
+ webmock (3.12.2)
698
696
  addressable (>= 2.3.6)
699
697
  crack (>= 0.3.2)
700
698
  hashdiff (>= 0.4.0, < 2.0.0)
@@ -2,9 +2,9 @@
2
2
 
3
3
  default: &default
4
4
  adapter: postgresql
5
- username: foreman
5
+ username: <%= ENV['PGUSER'] || 'foreman' %>
6
6
  password: foreman
7
- host: localhost
7
+ host: <%= ENV['PGHOST'] || 'localhost' %>
8
8
 
9
9
  test:
10
10
  <<: *default
data/config/routes.rb CHANGED
@@ -37,7 +37,7 @@ Rails.application.routes.draw do
37
37
  end
38
38
 
39
39
  scope '/r/insights' do
40
- match '/*path', :constraints => lambda { |req| !req.path.include?('view/api') }, to: 'machine_telemetries#forward_request', via: [:get, :post, :delete,:put, :patch]
40
+ match '(/*path)(/)', :constraints => lambda { |req| !req.path.include?('view/api') }, to: 'machine_telemetries#forward_request', via: [:get, :post, :delete,:put, :patch]
41
41
  end
42
42
  end
43
43
 
@@ -19,7 +19,9 @@ module ForemanInventoryUpload
19
19
  def generate_parameters
20
20
  return [] unless Setting[:include_parameter_tags]
21
21
 
22
- (@host.host_inherited_params_objects || []).map { |item| [item.name, item.value] }
22
+ (@host.host_inherited_params_objects || [])
23
+ .map { |item| [item.name, item.value] }
24
+ .select { |_name, value| value.present? || value.is_a?(FalseClass) }
23
25
  end
24
26
 
25
27
  private
@@ -1,3 +1,3 @@
1
1
  module ForemanRhCloud
2
- VERSION = '3.0.24.1'.freeze
2
+ VERSION = '3.0.29'.freeze
3
3
  end
@@ -98,6 +98,17 @@ module ForemanRhCloud
98
98
 
99
99
  # For testing purposes we can override the default hostname with an environment variable SATELLITE_RH_CLOUD_FOREMAN_HOST
100
100
  def self.foreman_host
101
- @foreman_host ||= ::Host.unscoped.friendly.find(ENV['SATELLITE_RH_CLOUD_FOREMAN_HOST'] || ::SmartProxy.default_capsule.name)
101
+ @foreman_host ||= begin
102
+ fullname = foreman_host_name
103
+ ::Host.unscoped.friendly.find(fullname)
104
+ rescue ActiveRecord::RecordNotFound
105
+ # fullname didn't work. Let's try shortname
106
+ shortname = /(?<shortname>[^\.]*)\.?.*/.match(fullname)[:shortname]
107
+ ::Host.unscoped.friendly.find(shortname)
108
+ end
109
+ end
110
+
111
+ def self.foreman_host_name
112
+ ENV['SATELLITE_RH_CLOUD_FOREMAN_HOST'] || ::SmartProxy.default_capsule.name
102
113
  end
103
114
  end
@@ -6,6 +6,11 @@ module InsightsCloud
6
6
  include ::ForemanRhCloud::CloudAuth
7
7
 
8
8
  def plan
9
+ unless cloud_auth_available?
10
+ logger.debug('Cloud authentication is not available, skipping insights sync')
11
+ return
12
+ end
13
+
9
14
  sequence do
10
15
  # This can be turned off when we enable automatic status syncs
11
16
  # This step will query cloud inventory to retrieve inventory uuids for each host
@@ -7,11 +7,21 @@ module InsightsCloud
7
7
 
8
8
  RULE_ID_REGEX = /[^:]*:(?<id>.*)/
9
9
 
10
+ def plan
11
+ unless cloud_auth_available?
12
+ logger.debug('Cloud authentication is not available, skipping resolutions sync')
13
+ return
14
+ end
15
+
16
+ plan_self
17
+ end
18
+
10
19
  def run
11
20
  InsightsResolution.transaction do
12
21
  InsightsResolution.delete_all
13
- api_response = query_insights_resolutions(relevant_rules)
14
- write_resolutions(api_response)
22
+ rule_ids = relevant_rules
23
+ api_response = query_insights_resolutions(rule_ids) unless rule_ids.empty?
24
+ write_resolutions(api_response) if api_response
15
25
  end
16
26
  end
17
27
 
@@ -6,8 +6,17 @@ module InsightsCloud
6
6
  include ::ForemanRhCloud::CloudAuth
7
7
 
8
8
  def plan
9
- plan_self
10
- plan_resolutions
9
+ unless cloud_auth_available?
10
+ logger.debug('Cloud authentication is not available, skipping rules sync')
11
+ return
12
+ end
13
+
14
+ # since the tasks are not connected, we need to force sequence execution here
15
+ # to make sure we don't run resolutions until we synced all our rules
16
+ sequence do
17
+ plan_self
18
+ plan_resolutions
19
+ end
11
20
  end
12
21
 
13
22
  def plan_resolutions
@@ -17,7 +17,6 @@ module InventorySync
17
17
  @sub_ids.map do |sub_id|
18
18
  host_id = host_id(sub_id)
19
19
  if host_id
20
- touched << host_id
21
20
  {
22
21
  host_id: host_id,
23
22
  status: InventorySync::InventoryStatus::SYNC,
@@ -28,10 +27,6 @@ module InventorySync
28
27
  end.compact
29
28
  end
30
29
 
31
- def touched
32
- @touched ||= []
33
- end
34
-
35
30
  def host_id(sub_id)
36
31
  hosts[sub_id]
37
32
  end
@@ -5,15 +5,16 @@ module InventorySync
5
5
  set_callback :step, :around, :update_statuses_batch
6
6
 
7
7
  def plan(organization)
8
+ unless cloud_auth_available?
9
+ logger.debug('Cloud authentication is not available, skipping inventory hosts sync')
10
+ return
11
+ end
12
+
8
13
  plan_self(organization_id: organization.id)
9
14
  end
10
15
 
11
16
  def setup_statuses
12
- @subscribed_hosts_ids = Set.new(
13
- ForemanInventoryUpload::Generators::Queries.for_slice(
14
- Host.unscoped.where(organization: input[:organization_id])
15
- ).pluck(:id)
16
- )
17
+ @subscribed_hosts_ids = Set.new(affected_host_ids)
17
18
 
18
19
  InventorySync::InventoryStatus.transaction do
19
20
  InventorySync::InventoryStatus.where(host_id: @subscribed_hosts_ids).delete_all
@@ -30,15 +31,18 @@ module InventorySync
30
31
  def update_statuses_batch
31
32
  results = yield
32
33
 
33
- update_hosts_status(results.status_hashes, results.touched)
34
- host_statuses[:sync] += results.touched.size
34
+ existing_hosts = results.status_hashes.select { |hash| @subscribed_hosts_ids.include?(hash[:host_id]) }
35
+
36
+ update_hosts_status(existing_hosts)
37
+ host_statuses[:sync] += existing_hosts.size
35
38
  end
36
39
 
37
40
  private
38
41
 
39
- def update_hosts_status(status_hashes, touched)
42
+ def update_hosts_status(status_hashes)
40
43
  InventorySync::InventoryStatus.create(status_hashes)
41
- @subscribed_hosts_ids.subtract(touched)
44
+ updated_ids = status_hashes.map { |hash| hash[:host_id] }
45
+ @subscribed_hosts_ids.subtract(updated_ids)
42
46
  end
43
47
 
44
48
  def add_missing_hosts_statuses(hosts_ids)
@@ -59,6 +63,12 @@ module InventorySync
59
63
  disconnect: 0,
60
64
  }
61
65
  end
66
+
67
+ def affected_host_ids
68
+ ForemanInventoryUpload::Generators::Queries.for_slice(
69
+ Host.unscoped.where(organization: input[:organization_id])
70
+ ).pluck(:id)
71
+ end
62
72
  end
63
73
  end
64
74
  end
@@ -5,6 +5,11 @@ module InventorySync
5
5
  set_callback :step, :around, :create_facets
6
6
 
7
7
  def plan
8
+ unless cloud_auth_available?
9
+ logger.debug('Cloud authentication is not available, skipping inventory hosts sync')
10
+ return
11
+ end
12
+
8
13
  # by default the tasks will be executed concurrently
9
14
  plan_self
10
15
  plan_self_host_sync
@@ -26,18 +31,14 @@ module InventorySync
26
31
  private
27
32
 
28
33
  def add_missing_insights_facets(uuids_hash)
29
- existing_facets = InsightsFacet.where(host_id: uuids_hash.keys).pluck(:host_id, :uuid)
30
- missing_facets = uuids_hash.except(*existing_facets.map(&:first)).map do |host_id, uuid|
34
+ all_facets = uuids_hash.map do |host_id, uuid|
31
35
  {
32
36
  host_id: host_id,
33
37
  uuid: uuid,
34
38
  }
35
39
  end
36
- InsightsFacet.create(missing_facets)
37
40
 
38
- existing_facets.select { |host_id, uuid| uuid.empty? }.each do |host_id, _uuid|
39
- InsightsFacet.where(host_id: host_id).update_all(uuid: uuids_hash[host_id])
40
- end
41
+ InsightsFacet.upsert_all(all_facets, unique_by: :host_id) unless all_facets.empty?
41
42
  end
42
43
 
43
44
  def plan_self_host_sync
@@ -3,6 +3,15 @@ module InventorySync
3
3
  class InventorySelfHostSync < QueryInventoryJob
4
4
  set_callback :step, :around, :create_facets
5
5
 
6
+ def plan
7
+ unless cloud_auth_available?
8
+ logger.debug('Cloud authentication is not available, skipping self host sync')
9
+ return
10
+ end
11
+
12
+ plan_self
13
+ end
14
+
6
15
  def create_facets
7
16
  # get the results from the event
8
17
  results = yield
data/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "foreman_rh_cloud",
3
- "version": "3.0.24.1",
3
+ "version": "3.0.29",
4
4
  "description": "Inventory Upload =============",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -26,7 +26,6 @@
26
26
  },
27
27
  "devDependencies": {
28
28
  "@babel/core": "~7.7.0",
29
- "@redhat-cloud-services/frontend-components": "^2.5.0",
30
29
  "@theforeman/builder": "~4.14.0",
31
30
  "@theforeman/stories": "~4.14.0",
32
31
  "@theforeman/test": "~4.14.0",
@@ -43,6 +42,7 @@
43
42
  },
44
43
  "dependencies": {
45
44
  "jed": "~1.1.1",
46
- "react-intl": "~2.8.0"
45
+ "react-intl": "~2.8.0",
46
+ "@redhat-cloud-services/frontend-components": "^2.5.0"
47
47
  }
48
48
  }
@@ -7,6 +7,7 @@ class InsightsFullSyncTest < ActiveSupport::TestCase
7
7
  setup do
8
8
  InsightsCloud::Async::InsightsFullSync.any_instance.stubs(:plan_rules_sync)
9
9
  InsightsCloud::Async::InsightsFullSync.any_instance.stubs(:plan_notifications)
10
+ FactoryBot.create(:setting, name: 'rh_cloud_token', value: 'MOCK_TOKEN')
10
11
 
11
12
  uuid1 = 'accdf444-5628-451d-bf3e-cf909ad72756'
12
13
  @host1 = FactoryBot.create(:host, :managed, name: 'host1')
@@ -1,4 +1,4 @@
1
- require 'test_helper'
1
+ require 'test_plugin_helper'
2
2
  require 'foreman_tasks/test_helpers'
3
3
 
4
4
  class InsightsResolutionsSyncTest < ActiveSupport::TestCase
@@ -63,6 +63,7 @@ class InsightsResolutionsSyncTest < ActiveSupport::TestCase
63
63
  }
64
64
 
65
65
  @rule = FactoryBot.create(:insights_rule, rule_id: 'network_tcp_connection_hang|NETWORK_TCP_CONNECTION_HANG_WARN')
66
+ FactoryBot.create(:setting, name: 'rh_cloud_token', value: 'MOCK_TOKEN')
66
67
  end
67
68
 
68
69
  test 'Resolutions data is replaced with data from cloud' do
@@ -74,4 +75,13 @@ class InsightsResolutionsSyncTest < ActiveSupport::TestCase
74
75
  assert_equal 5, InsightsResolution.all.count
75
76
  assert_equal 2, @rule.resolutions.count
76
77
  end
78
+
79
+ test 'Skips pinging the cloud if no rule ids were found' do
80
+ InsightsCloud::Async::InsightsResolutionsSync.any_instance.expects(:query_insights_resolutions).never
81
+ InsightsRule.all.delete_all
82
+
83
+ ForemanTasks.sync_task(InsightsCloud::Async::InsightsResolutionsSync)
84
+
85
+ assert_equal 0, InsightsResolution.all.count
86
+ end
77
87
  end
@@ -112,6 +112,7 @@ class InsightsRulesSyncTest < ActiveSupport::TestCase
112
112
  @hit = FactoryBot.create(:insights_hit, host_id: @host.id)
113
113
 
114
114
  InsightsCloud::Async::InsightsRulesSync.any_instance.stubs(:plan_resolutions)
115
+ FactoryBot.create(:setting, name: 'rh_cloud_token', value: 'MOCK_TOKEN')
115
116
  end
116
117
 
117
118
  test 'Hits data is replaced with data from cloud' do
@@ -37,6 +37,18 @@ class InventoryFullSyncTest < ActiveSupport::TestCase
37
37
  @host2.subscription_facet.pools << pool
38
38
  @host2_inventory_id = '4536bf5c-ff03-4154-a8c9-32ff4b40e40c'
39
39
 
40
+ # this host would pass our plugin queries, so it could be uploaded to the cloud.
41
+ @host3 = FactoryBot.create(
42
+ :host,
43
+ :with_subscription,
44
+ :with_content,
45
+ content_view: cv.first,
46
+ lifecycle_environment: env,
47
+ organization: env.organization
48
+ )
49
+
50
+ @host3.subscription_facet.pools << pool
51
+
40
52
  ForemanInventoryUpload::Generators::Queries.instance_variable_set(:@fact_names, nil)
41
53
 
42
54
  inventory_json = <<-INVENTORY_JSON
@@ -151,7 +163,7 @@ class InventoryFullSyncTest < ActiveSupport::TestCase
151
163
  {
152
164
  "insights_id": "b533848e-465f-4f1a-9b2b-b71cb2d5239d",
153
165
  "rhel_machine_id": null,
154
- "subscription_manager_id": "d29bde40-348e-437c-8acf-8fa98320fc1b",
166
+ "subscription_manager_id": "#{@host3.subscription_facet.uuid}",
155
167
  "satellite_id": "d29bde40-348e-437c-8acf-8fa98320fc1b",
156
168
  "bios_uuid": "3cd5d972-cfb5-451a-8314-fd2f56629d7c",
157
169
  "ip_addresses": [
@@ -159,7 +171,7 @@ class InventoryFullSyncTest < ActiveSupport::TestCase
159
171
  "fd6e:2298:736e::857",
160
172
  "fd6e:2298:736e:0:2c66:6101:9cc6:2b23"
161
173
  ],
162
- "fqdn": "rhel8-demo.oss-lab.net",
174
+ "fqdn": "#{@host3.fqdn}",
163
175
  "mac_addresses": [
164
176
  "6e:66:a6:fe:fc:07",
165
177
  "00:00:00:00:00:00"
@@ -242,6 +254,7 @@ class InventoryFullSyncTest < ActiveSupport::TestCase
242
254
  end
243
255
 
244
256
  test 'Host status should be SYNC for inventory hosts' do
257
+ FactoryBot.create(:setting, name: 'rh_cloud_token', value: 'TEST TOKEN')
245
258
  InventorySync::Async::InventoryFullSync.any_instance.expects(:query_inventory).returns(@inventory)
246
259
 
247
260
  ForemanTasks.sync_task(InventorySync::Async::InventoryFullSync, @host2.organization)
@@ -253,6 +266,7 @@ class InventoryFullSyncTest < ActiveSupport::TestCase
253
266
  end
254
267
 
255
268
  test 'Host status should be DISCONNECT for hosts that are not returned from cloud' do
269
+ FactoryBot.create(:setting, name: 'rh_cloud_token', value: 'TEST TOKEN')
256
270
  InventorySync::Async::InventoryFullSync.any_instance.expects(:query_inventory).returns(@inventory)
257
271
  FactoryBot.create(:fact_value, fact_name: fact_names['virt::uuid'], value: '1234', host: @host2)
258
272
 
@@ -261,4 +275,26 @@ class InventoryFullSyncTest < ActiveSupport::TestCase
261
275
 
262
276
  assert_equal InventorySync::InventoryStatus::DISCONNECT, InventorySync::InventoryStatus.where(host_id: @host1.id).first.status
263
277
  end
278
+
279
+ test 'Task should be aborted if token is not present' do
280
+ FactoryBot.create(:setting, name: 'rh_cloud_token', value: '')
281
+
282
+ InventorySync::Async::InventoryFullSync.any_instance.expects(:plan_self).never
283
+
284
+ ForemanTasks.sync_task(InventorySync::Async::InventoryFullSync, @host1.organization)
285
+ end
286
+
287
+ test 'Should skip hosts that are not returned in query' do
288
+ assert_nil InventorySync::InventoryStatus.where(host_id: @host3.id).first
289
+
290
+ FactoryBot.create(:setting, name: 'rh_cloud_token', value: 'TEST TOKEN')
291
+ InventorySync::Async::InventoryFullSync.any_instance.expects(:query_inventory).returns(@inventory)
292
+ InventorySync::Async::InventoryFullSync.any_instance.expects(:affected_host_ids).returns([@host1.id, @host2.id])
293
+ FactoryBot.create(:fact_value, fact_name: fact_names['virt::uuid'], value: '1234', host: @host2)
294
+
295
+ ForemanTasks.sync_task(InventorySync::Async::InventoryFullSync, @host1.organization)
296
+ @host2.reload
297
+
298
+ assert_nil InventorySync::InventoryStatus.where(host_id: @host3.id).first
299
+ end
264
300
  end
@@ -6,6 +6,7 @@ class InventoryHostsSyncTest < ActiveSupport::TestCase
6
6
 
7
7
  setup do
8
8
  User.current = User.find_by(login: 'secret_admin')
9
+ FactoryBot.create(:setting, name: 'rh_cloud_token', value: 'MOCK_TOKEN')
9
10
 
10
11
  env = FactoryBot.create(:katello_k_t_environment)
11
12
  cv = env.content_views << FactoryBot.create(:katello_content_view, organization: env.organization)
@@ -264,4 +265,19 @@ class InventoryHostsSyncTest < ActiveSupport::TestCase
264
265
 
265
266
  assert_equal @host2_inventory_id, @host2.insights.uuid
266
267
  end
268
+
269
+ test 'Inventory should sync empty facets list' do
270
+ empty_inventory = @inventory.deep_clone
271
+ empty_inventory['results'] = []
272
+ InventorySync::Async::InventoryHostsSync.any_instance.expects(:query_inventory).returns(empty_inventory)
273
+ InventorySync::Async::InventoryHostsSync.any_instance.expects(:plan_self_host_sync)
274
+
275
+ assert_nil @host2.insights
276
+
277
+ ForemanTasks.sync_task(InventorySync::Async::InventoryHostsSync)
278
+
279
+ @host2.reload
280
+
281
+ assert_nil @host2.insights
282
+ end
267
283
  end
@@ -6,6 +6,7 @@ class InventorySelfHostSyncTest < ActiveSupport::TestCase
6
6
 
7
7
  setup do
8
8
  User.current = User.find_by(login: 'secret_admin')
9
+ FactoryBot.create(:setting, name: 'rh_cloud_token', value: 'MOCK_TOKEN')
9
10
 
10
11
  # this host would pass our plugin queries, so it could be uploaded to the cloud.
11
12
  @host1 = FactoryBot.create(:host)
@@ -0,0 +1,28 @@
1
+ require 'test_plugin_helper'
2
+
3
+ class ForemanRhCloudSelfHostTest < ActiveSupport::TestCase
4
+ setup do
5
+ # reset cached value
6
+ ForemanRhCloud.instance_variable_set(:@foreman_host, nil)
7
+ end
8
+
9
+ test 'finds host by fullname' do
10
+ @domain
11
+ @host = FactoryBot.create(:host, :managed)
12
+ ForemanRhCloud.expects(:foreman_host_name).returns(@host.name)
13
+
14
+ actual = ForemanRhCloud.foreman_host
15
+
16
+ assert_not_nil actual
17
+ end
18
+
19
+ test 'finds host by shortname' do
20
+ @host = FactoryBot.create(:host, :managed)
21
+ Host.where(name: @host.name).update_all(name: @host.shortname)
22
+ ForemanRhCloud.expects(:foreman_host_name).returns(@host.name)
23
+
24
+ actual = ForemanRhCloud.foreman_host
25
+
26
+ assert_not_nil actual
27
+ end
28
+ end
@@ -48,6 +48,7 @@ class CloudRequestForwarderTest < ActiveSupport::TestCase
48
48
  "/redhat_access/r/insights/platform/inventory/v1/hosts" => "https://cert.cloud.redhat.com/api/inventory/v1/hosts",
49
49
  "/redhat_access/r/insights/platform/ingress/v1/upload" => "https://cert.cloud.redhat.com/api/ingress/v1/upload",
50
50
  "/redhat_access/r/insights/uploads/67200803-132b-474b-a6f9-37be74185df4" => "https://cert-api.access.redhat.com/r/insights/uploads/67200803-132b-474b-a6f9-37be74185df4",
51
+ "/redhat_access/r/insights/" => "https://cert.cloud.redhat.com/api/apicast-tests/ping",
51
52
  }
52
53
 
53
54
  paths.each do |key, value|
@@ -8,6 +8,7 @@ class TemplateRendererHelperTest < ActiveSupport::TestCase
8
8
  response.stubs(:body).returns('TEST PLAYBOOK')
9
9
  ForemanRhCloud::RemediationsRetriever.any_instance.stubs(:query_playbook).returns(response)
10
10
  @host1 = FactoryBot.create(:host)
11
+ FactoryBot.create(:setting, name: 'rh_cloud_token', value: 'MOCK_TOKEN')
11
12
  end
12
13
 
13
14
  test 'Generates a playbook for hit and remediation' do
@@ -62,6 +62,47 @@ class TagsGeneratorTest < ActiveSupport::TestCase
62
62
  assert_equal false, actual.key?('content_view')
63
63
  end
64
64
 
65
+ test 'generates parameter tags' do
66
+ FactoryBot.create(:setting, :name => 'include_parameter_tags', :settings_type => "boolean", :category => "Setting::RhCloud", :default => false, :value => true)
67
+
68
+ @host.stubs(:host_inherited_params_objects).returns(
69
+ [
70
+ OpenStruct.new(name: 'bool_param', value: true),
71
+ OpenStruct.new(name: 'false_param', value: false),
72
+ OpenStruct.new(name: 'int_param', value: 1),
73
+ OpenStruct.new(name: 'empty_param', value: nil),
74
+ OpenStruct.new(name: 'empty_str_param', value: ''),
75
+ ]
76
+ )
77
+
78
+ generator = create_generator
79
+ actual = Hash[generator.generate_parameters]
80
+
81
+ assert_equal 3, actual.count
82
+ assert_equal true, actual['bool_param']
83
+ assert_equal false, actual['false_param']
84
+ assert_equal 1, actual['int_param']
85
+ end
86
+
87
+ test 'skips parameter tags if include_parameter_tags setting is off' do
88
+ FactoryBot.create(:setting, :name => 'include_parameter_tags', :settings_type => "boolean", :category => "Setting::RhCloud", :default => false, :value => false)
89
+
90
+ @host.stubs(:host_inherited_params_objects).returns(
91
+ [
92
+ OpenStruct.new(name: 'bool_param', value: true),
93
+ OpenStruct.new(name: 'false_param', value: false),
94
+ OpenStruct.new(name: 'int_param', value: 1),
95
+ OpenStruct.new(name: 'empty_param', value: nil),
96
+ OpenStruct.new(name: 'empty_str_param', value: ''),
97
+ ]
98
+ )
99
+
100
+ generator = create_generator
101
+ actual = generator.generate_parameters.group_by { |key, value| key }
102
+
103
+ assert_equal 0, actual.count
104
+ end
105
+
65
106
  private
66
107
 
67
108
  def create_generator
@@ -6,4 +6,18 @@
6
6
  margin-top: 5px;
7
7
  }
8
8
  }
9
+
10
+ // applies to the backdrop parent of the modal
11
+ @at-root .pf-c-backdrop {
12
+ width: calc(100% - 200px) !important;
13
+ left: 200px !important;
14
+ }
15
+
16
+ // where the vertical nav breaks: https://github.com/theforeman/foreman/blob/3347fa49d500964f0209122d8d36c920d1feafcc/webpack/assets/javascripts/react_app/components/Layout/components/Toolbar/HeaderToolbar.scss#L26
17
+ @media (max-width: 768px) {
18
+ @at-root .pf-c-backdrop {
19
+ width: 100% !important;
20
+ left: 0 !important;
21
+ }
22
+ }
9
23
  }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: foreman_rh_cloud
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.24.1
4
+ version: 3.0.29
5
5
  platform: ruby
6
6
  authors:
7
7
  - Foreman Red Hat Cloud team
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-07-21 00:00:00.000000000 Z
11
+ date: 2021-11-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: katello
@@ -267,6 +267,7 @@ files:
267
267
  - test/test_plugin_helper.rb
268
268
  - test/unit/archived_report_generator_test.rb
269
269
  - test/unit/fact_helpers_test.rb
270
+ - test/unit/foreman_rh_cloud_self_host_test.rb
270
271
  - test/unit/insights_facet_test.rb
271
272
  - test/unit/metadata_generator_test.rb
272
273
  - test/unit/rh_cloud_http_proxy_test.rb
@@ -671,7 +672,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
671
672
  - !ruby/object:Gem::Version
672
673
  version: '0'
673
674
  requirements: []
674
- rubygems_version: 3.2.15
675
+ rubygems_version: 3.2.22
675
676
  signing_key:
676
677
  specification_version: 4
677
678
  summary: Summary of ForemanRhCloud.
@@ -698,6 +699,7 @@ test_files:
698
699
  - test/test_plugin_helper.rb
699
700
  - test/unit/archived_report_generator_test.rb
700
701
  - test/unit/fact_helpers_test.rb
702
+ - test/unit/foreman_rh_cloud_self_host_test.rb
701
703
  - test/unit/insights_facet_test.rb
702
704
  - test/unit/metadata_generator_test.rb
703
705
  - test/unit/rh_cloud_http_proxy_test.rb