foreman_rh_cloud 9.0.61 → 10.0.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4154539307307d18565103200ec4c32d56e75e87aca0b9dbc1539ae6e50c49fe
4
- data.tar.gz: 338607b5ac88be16b3bad2d31b748c31b072a11a13075c194d75e5e3df055645
3
+ metadata.gz: 0ff94b0740c89b0b945f90e7feba658b30341a7f8bb5c1fd2e59cdfc68d05969
4
+ data.tar.gz: b25c4f29a021b554b425d6d464971aed419e3021736730b696710c10e9804670
5
5
  SHA512:
6
- metadata.gz: 0e4c31e7b47d075c72953cad87ad82df02d59417dc6ff5161501b5ed93a7dbbe240b8e13a21195f6c781c5e09cf50d7fcd667b312b8a58d4150c46164055a8b7
7
- data.tar.gz: 3d9567390cc9b87e85e361c182485037c31a91eea35caa23f71f951eab976ac1052796a87c038306ce9907df4413151a08e4a63da9d511bac1ca510d580b0618
6
+ metadata.gz: 6c4b8398e71971b211bb7eb5a76f3d4acd2a274eb69cd9c6f33c8961e0824c8f9da3a34e7ae72c438ab9ddc5042f9a4e3aee53bf24c5ad07ce617b3bdba83eee
7
+ data.tar.gz: a0f2b3d8d0b1ddf1c0bccd5eeef2c818d8f81bf1a05eaa5e9f0a9bacd70368381d362343f5bc454023b258c238127664f4aaac709fe40feae03ae8b400f80f0c
data/README.md CHANGED
@@ -15,7 +15,7 @@ for how to install Foreman plugins
15
15
 
16
16
  #### Inventory upload
17
17
 
18
- In UI: Insights -> Inventory Upload -> select the organization -> Generate and upload report
18
+ In UI: Configure -> Inventory Upload -> Restart
19
19
 
20
20
  From command-line:
21
21
 
@@ -38,7 +38,7 @@ From command-line:
38
38
 
39
39
  #### Fetch hosts remediation data
40
40
 
41
- In UI: Insights -> Recommendations -> Sync recommendations (under the vertical ellipsis)
41
+ In UI: Configure -> Insights -> Sync now
42
42
 
43
43
  From command-line:
44
44
 
@@ -46,7 +46,7 @@ From command-line:
46
46
 
47
47
  #### Synchronize inventory status
48
48
 
49
- In UI: Insights -> Inventory Upload -> Sync all inventory status
49
+ In UI: Configure -> Inventory Upload -> Sync inventory status
50
50
 
51
51
  From command-line:
52
52
 
@@ -16,41 +16,27 @@ module InsightsCloud::Api
16
16
  # The method that "proxies" requests over to Cloud
17
17
  def forward_request
18
18
  certs = candlepin_id_cert @organization
19
- begin
20
- @cloud_response = ::ForemanRhCloud::CloudRequestForwarder.new.forward_request(request, controller_name, @branch_id, certs)
21
- rescue RestClient::Exceptions::Timeout => e
22
- response_obj = e.response.presence || e.exception
23
- return render json: { message: response_obj.to_s, error: response_obj.to_s }, status: :gateway_timeout
24
- rescue RestClient::Unauthorized => e
25
- logger.warn("Forwarding request auth error: #{e}")
26
- message = 'Authentication to the Insights Service failed.'
27
- return render json: { message: message, error: message }, status: :unauthorized
28
- rescue RestClient::NotModified => e
29
- logger.info("Forwarding request not modified: #{e}")
30
- message = 'Cloud request not modified'
31
- return render json: { message: message, error: message }, status: :not_modified
32
- rescue RestClient::ExceptionWithResponse => e
33
- response_obj = e.response.presence || e.exception
34
- code = response_obj.try(:code) || response_obj.try(:http_code) || 500
35
- message = 'Cloud request failed'
19
+ @cloud_response = ::ForemanRhCloud::CloudRequestForwarder.new.forward_request(request, controller_name, @branch_id, certs)
36
20
 
21
+ if @cloud_response.code == 401
37
22
  return render json: {
38
- :message => message,
39
- :error => response_obj.to_s,
23
+ :message => 'Authentication to the Insights Service failed.',
40
24
  :headers => {},
41
- :response => response_obj,
42
- }, status: code
43
- rescue StandardError => e
44
- # Catch any other exceptions here, such as Errno::ECONNREFUSED
45
- logger.warn("Cloud request failed with exception: #{e}")
46
- return render json: { error: e.to_s }, status: :bad_gateway
25
+ }, status: :bad_gateway
26
+ end
27
+
28
+ if @cloud_response.code >= 300
29
+ return render json: {
30
+ :message => 'Cloud request failed',
31
+ :headers => {},
32
+ :response => @cloud_response,
33
+ }, status: @cloud_response.code
47
34
  end
48
35
 
49
36
  # Append redhat-specific headers
50
37
  @cloud_response.headers.each do |key, value|
51
38
  assign_header(response, @cloud_response, key, false) if key.to_s.start_with?('x_rh_')
52
39
  end
53
-
54
40
  # Append general headers
55
41
  assign_header(response, @cloud_response, :x_resource_count, true)
56
42
  headers[Rack::ETAG] = @cloud_response.headers[:etag]
@@ -60,8 +46,8 @@ module InsightsCloud::Api
60
46
  # content type
61
47
  send_data @cloud_response, disposition: @cloud_response.headers[:content_disposition], type: @cloud_response.headers[:content_type]
62
48
  elsif @cloud_response.headers[:content_type] =~ /zip/
63
- # If there is no Content-Disposition, but the content type is binary according to Content-Type, send the raw data
64
- # with proper content type
49
+ # if there is no Content-Disposition, but the content type is binary according the content type,
50
+ # forward the request as binry too
65
51
  send_data @cloud_response, type: @cloud_response.headers[:content_type]
66
52
  else
67
53
  render json: @cloud_response, status: @cloud_response.code
@@ -13,15 +13,9 @@ module ForemanRhCloud
13
13
  logger.debug("Response headers for request url #{final_params[:url]} are: #{response.headers}")
14
14
 
15
15
  response
16
- rescue RestClient::Exceptions::Timeout => ex
17
- logger.debug("Timeout exception raised for request url #{final_params[:url]}: #{ex}")
18
- raise
19
- rescue RestClient::ExceptionWithResponse => ex
20
- logger.debug("Response headers for request url #{final_params[:url]} with status code #{ex.http_code} are: #{ex.http_headers} and body: #{ex.http_body}")
21
- raise
22
- rescue StandardError => ex
23
- logger.debug("Exception raised for request url #{final_params[:url]}: #{ex}")
24
- raise
16
+ rescue RestClient::Exception => ex
17
+ logger.debug("Failed response with code #{ex.http_code} headers for request url #{final_params[:url]} are: #{ex.http_headers} and body: #{ex.http_body}")
18
+ raise ex
25
19
  end
26
20
  end
27
21
  end
@@ -17,6 +17,8 @@ module ForemanRhCloud
17
17
  logger.debug("Sending request to: #{request_opts[:url]}")
18
18
 
19
19
  execute_cloud_request(request_opts)
20
+ rescue RestClient::Exception => error_response
21
+ error_response.response
20
22
  end
21
23
 
22
24
  def prepare_request_opts(original_request, forward_payload, forward_params, certs)
@@ -48,9 +50,7 @@ module ForemanRhCloud
48
50
 
49
51
  def prepare_forward_params(original_request, branch_id)
50
52
  forward_params = original_request.query_parameters
51
- compliance_request = original_request.path.match?(/compliance\/v2(\/.*)?/)
52
- user_agent = original_request.user_agent.present? && !original_request.user_agent.include?('redhat_access_cfme')
53
- if user_agent && !compliance_request
53
+ if original_request.user_agent && !original_request.user_agent.include?('redhat_access_cfme')
54
54
  forward_params = forward_params.merge(:branch_id => branch_id)
55
55
  end
56
56
 
@@ -6,7 +6,7 @@ module ForemanInventoryUpload
6
6
  extend ActiveSupport::Concern
7
7
 
8
8
  CLOUD_AMAZON = 'aws'
9
- CLOUD_GOOGLE = 'google'
9
+ CLOUD_GOOGLE = 'gcp'
10
10
  CLOUD_AZURE = 'azure'
11
11
  CLOUD_ALIBABA = 'alibaba'
12
12
 
@@ -126,7 +126,6 @@ module ForemanInventoryUpload
126
126
  ) { |v| os_release_value(*v) }
127
127
  @stream.simple_field('os_kernel_version', fact_value(host, 'uname::release'))
128
128
  @stream.simple_field('arch', host.architecture&.name)
129
- @stream.simple_field('subscription_status', host.subscription_status_label)
130
129
  @stream.simple_field('katello_agent_running', false)
131
130
  @stream.simple_field(
132
131
  'infrastructure_type',
@@ -75,7 +75,7 @@ module ForemanInventoryUpload
75
75
  end
76
76
 
77
77
  def self.inventory_export_url
78
- tags = URI.encode("satellite/satellite_instance_id=#{Foreman.instance_id}")
78
+ tags = CGI.escape("satellite/satellite_instance_id=#{Foreman.instance_id}")
79
79
  inventory_base_url + "?tags=#{tags}"
80
80
  end
81
81
 
@@ -1,3 +1,3 @@
1
1
  module ForemanRhCloud
2
- VERSION = '9.0.61'.freeze
2
+ VERSION = '10.0.1'.freeze
3
3
  end
@@ -9,11 +9,10 @@ module InsightsCloud
9
9
 
10
10
  def plan(organizations)
11
11
  organizations = organizations.select do |organization|
12
- checker = ::Katello::UpstreamConnectionChecker.new(organization)
13
- if cert_auth_available?(organization) && !organization.manifest_expired? && checker.can_connect?
12
+ if cert_auth_available?(organization)
14
13
  true
15
14
  else
16
- logger.info("A manifest is not available for org: #{organization.name}, or it has expired, or been deleted. skipping insights sync")
15
+ logger.debug("Certificate is not available for org: #{organization.name}, skipping insights sync")
17
16
  false
18
17
  end
19
18
  end
@@ -21,23 +20,19 @@ module InsightsCloud
21
20
  sequence do
22
21
  # This can be turned off when we enable automatic status syncs
23
22
  # This step will query cloud inventory to retrieve inventory uuids for each host
24
- valid_organizations = organizations.reject(&:manifest_expired?)
25
- if valid_organizations.any?
26
- plan_hosts_sync(organizations)
27
- plan_self(organization_ids: organizations.map(&:id))
28
- concurrence do
29
- plan_rules_sync(organizations)
30
- plan_notifications
31
- end
23
+ plan_hosts_sync(organizations)
24
+ plan_self(organization_ids: organizations.map(&:id))
25
+ concurrence do
26
+ plan_rules_sync(organizations)
27
+ plan_notifications
32
28
  end
33
29
  end
34
30
  end
35
31
 
36
32
  def try_execute
37
33
  organizations.each do |organization|
38
- checker = ::Katello::UpstreamConnectionChecker.new(organization)
39
- if !cert_auth_available?(organization) && organization.manifest_expired && !checker.can_connect?
40
- logger.info("A manifest is not available for org: #{organization.name}, or it has expired, or been deleted. skipping insights sync")
34
+ unless cert_auth_available?(organization)
35
+ logger.debug("Certificate is not available for org: #{organization.name}, skipping insights sync")
41
36
  next
42
37
  end
43
38
 
@@ -13,11 +13,7 @@ module InsightsCloud
13
13
  InsightsResolution.delete_all
14
14
  rule_ids = relevant_rules
15
15
  Organization.all.each do |organization|
16
- checker = ::Katello::UpstreamConnectionChecker.new(organization)
17
- if !cert_auth_available?(organization) || organization.manifest_expired? || !checker.can_connect?
18
- logger.info("A manifest is not available for org: #{organization.name}, or it has expired, or been deleted. skipping resolutions sync")
19
- next
20
- end
16
+ next if !cert_auth_available?(organization) || organization.manifest_expired?
21
17
  api_response = query_insights_resolutions(rule_ids, organization) unless rule_ids.empty?
22
18
  written_rules = write_resolutions(api_response) if api_response
23
19
  rule_ids -= Array(written_rules)
@@ -64,7 +60,13 @@ module InsightsCloud
64
60
 
65
61
  def write_resolutions(response)
66
62
  all_resolutions = response.map do |rule_id, rule_details|
67
- rule_details['resolutions'].map { |resolution| to_resolution_hash(to_rule_id(rule_id), resolution) }
63
+ if rule_details
64
+ rule_details['resolutions'].map { |resolution| to_resolution_hash(to_rule_id(rule_id), resolution) }
65
+ else
66
+ logger.info("Rules response: #{rule_id} #{rule_details}")
67
+ logger.debug("Response: #{response}\n Failed id #{rule_id}")
68
+ []
69
+ end
68
70
  end.flatten
69
71
 
70
72
  InsightsResolution.create(all_resolutions)
@@ -15,9 +15,10 @@ namespace :rh_cloud_insights do
15
15
  end
16
16
 
17
17
  cleaner = ForemanRhCloud::InsightsStatusCleaner.new
18
- deleted_count = cleaner.clean(hosts_search)
19
-
20
- puts "Deleted #{deleted_count} insights statuses"
18
+ User.as_anonymous_admin do
19
+ deleted_count = cleaner.clean(hosts_search)
20
+ puts "Deleted #{deleted_count} insights statuses"
21
+ end
21
22
  end
22
23
 
23
24
  desc "Re-announce all organizations into Sources on RH cloud."
data/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "foreman_rh_cloud",
3
- "version": "9.0.61",
3
+ "version": "10.0.1",
4
4
  "description": "Inventory Upload =============",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -83,46 +83,13 @@ module InsightsCloud::Api
83
83
  assert_equal net_http_resp[:content_type], @response.headers['Content-Type']
84
84
  end
85
85
 
86
- test "should handle StandardError" do
87
- error_message = "Connection refused"
88
- ::ForemanRhCloud::CloudRequestForwarder.any_instance.stubs(:execute_cloud_request).raises(Errno::ECONNREFUSED.new)
89
-
90
- get :forward_request, params: { "path" => "platform/module-update-router/v1/channel" }
91
- assert_equal 502, @response.status
92
- body = JSON.parse(@response.body)
93
- assert_equal error_message, body['error']
94
- end
95
-
96
- test "should handle 304 cloud" do
97
- net_http_resp = Net::HTTPResponse.new(1.0, 304, "Not Modified")
98
- res = RestClient::Response.create(@body, net_http_resp, @http_req)
99
-
100
- ::ForemanRhCloud::CloudRequestForwarder.any_instance.stubs(:execute_cloud_request).raises(RestClient::NotModified.new(res))
101
-
102
- get :forward_request, params: { "path" => "platform/module-update-router/v1/channel" }
103
- assert_equal 304, @response.status
104
- assert_equal 'Cloud request not modified', JSON.parse(@response.body)['message']
105
- end
106
-
107
- test "should handle RestClient::Exceptions::Timeout" do
108
- timeout_message = "execution expired"
109
- ::ForemanRhCloud::CloudRequestForwarder.any_instance.stubs(:execute_cloud_request).raises(RestClient::Exceptions::Timeout.new(timeout_message))
110
-
111
- get :forward_request, params: { "path" => "platform/module-update-router/v1/channel" }
112
- assert_equal 504, @response.status
113
- body = JSON.parse(@response.body)
114
- assert_equal timeout_message, body['message']
115
- assert_equal timeout_message, body['error']
116
- end
117
-
118
86
  test "should handle failed authentication to cloud" do
119
87
  net_http_resp = Net::HTTPResponse.new(1.0, 401, "Unauthorized")
120
88
  res = RestClient::Response.create(@body, net_http_resp, @http_req)
121
-
122
- ::ForemanRhCloud::CloudRequestForwarder.any_instance.stubs(:execute_cloud_request).raises(RestClient::Unauthorized.new(res))
89
+ ::ForemanRhCloud::CloudRequestForwarder.any_instance.stubs(:forward_request).returns(res)
123
90
 
124
91
  get :forward_request, params: { "path" => "platform/module-update-router/v1/channel" }
125
- assert_equal 401, @response.status
92
+ assert_equal 502, @response.status
126
93
  assert_equal 'Authentication to the Insights Service failed.', JSON.parse(@response.body)['message']
127
94
  end
128
95
 
@@ -65,8 +65,6 @@ class InsightsFullSyncTest < ActiveSupport::TestCase
65
65
  end
66
66
 
67
67
  test 'Hits data is replaced with data from cloud' do
68
- Organization.any_instance.stubs(:manifest_expired?).returns(false)
69
- Katello::UpstreamConnectionChecker.any_instance.stubs(:can_connect?).returns(true)
70
68
  InsightsCloud::Async::InsightsFullSync.any_instance.expects(:query_insights_hits).returns(@hits)
71
69
 
72
70
  InsightsCloud::Async::InsightsFullSync.any_instance.expects(:plan_hosts_sync)
@@ -81,31 +79,7 @@ class InsightsFullSyncTest < ActiveSupport::TestCase
81
79
  assert_equal 1, @host2.insights.hits.count
82
80
  end
83
81
 
84
- test 'Manifest is expired do not run task steps' do
85
- Organization.any_instance.stubs(:manifest_expired?).returns(true)
86
- Katello::UpstreamConnectionChecker.any_instance.stubs(:can_connect?).returns(true)
87
-
88
- InsightsCloud::Async::InsightsFullSync.any_instance.expects(:query_insights_hits).never
89
- InsightsCloud::Async::InsightsFullSync.any_instance.expects(:plan_hosts_sync).never
90
- InsightsCloud::Async::InsightsFullSync.any_instance.expects(:plan_self).never
91
-
92
- ForemanTasks.sync_task(InsightsCloud::Async::InsightsFullSync, [@host1.organization])
93
- end
94
-
95
- test 'Manifest is deleted do not run task steps' do
96
- Organization.any_instance.stubs(:manifest_expired?).returns(false)
97
- Katello::UpstreamConnectionChecker.any_instance.stubs(:can_connect?).returns(false)
98
-
99
- InsightsCloud::Async::InsightsFullSync.any_instance.expects(:query_insights_hits).never
100
- InsightsCloud::Async::InsightsFullSync.any_instance.expects(:plan_hosts_sync).never
101
- InsightsCloud::Async::InsightsFullSync.any_instance.expects(:plan_self).never
102
-
103
- ForemanTasks.sync_task(InsightsCloud::Async::InsightsFullSync, [@host1.organization])
104
- end
105
-
106
82
  test 'Hits counters are reset correctly' do
107
- Organization.any_instance.stubs(:manifest_expired?).returns(false)
108
- Katello::UpstreamConnectionChecker.any_instance.stubs(:can_connect?).returns(true)
109
83
  InsightsCloud::Async::InsightsFullSync.any_instance.expects(:query_insights_hits).returns(@hits).twice
110
84
 
111
85
  InsightsCloud::Async::InsightsFullSync.any_instance.stubs(:plan_hosts_sync)
@@ -123,8 +97,6 @@ class InsightsFullSyncTest < ActiveSupport::TestCase
123
97
  end
124
98
 
125
99
  test 'Hits ignoring non-existent hosts' do
126
- Organization.any_instance.stubs(:manifest_expired?).returns(false)
127
- Katello::UpstreamConnectionChecker.any_instance.stubs(:can_connect?).returns(true)
128
100
  hits_json = <<-HITS_JSON
129
101
  [
130
102
  {
@@ -73,7 +73,6 @@ class InsightsResolutionsSyncTest < ActiveSupport::TestCase
73
73
  end
74
74
 
75
75
  test 'Resolutions data is replaced with data from cloud' do
76
- Katello::UpstreamConnectionChecker.any_instance.stubs(:can_connect?).returns(true)
77
76
  InsightsCloud::Async::InsightsResolutionsSync.any_instance.stubs(:query_insights_resolutions).returns(@resolutions)
78
77
 
79
78
  ForemanTasks.sync_task(InsightsCloud::Async::InsightsResolutionsSync)
@@ -83,28 +82,7 @@ class InsightsResolutionsSyncTest < ActiveSupport::TestCase
83
82
  assert_equal 2, @rule.resolutions.count
84
83
  end
85
84
 
86
- test 'Manifest is deleted do not run task steps' do
87
- Organization.any_instance.stubs(:manifest_expired?).returns(false)
88
- Katello::UpstreamConnectionChecker.any_instance.stubs(:can_connect?).returns(false)
89
- InsightsCloud::Async::InsightsResolutionsSync.any_instance.expects(:query_insights_resolutions).never
90
-
91
- ForemanTasks.sync_task(InsightsCloud::Async::InsightsResolutionsSync)
92
-
93
- assert_equal 0, InsightsResolution.all.count
94
- end
95
-
96
- test 'Manifest is expired do not run task steps' do
97
- Organization.any_instance.stubs(:manifest_expired?).returns(true)
98
- Katello::UpstreamConnectionChecker.any_instance.stubs(:can_connect?).returns(true)
99
- InsightsCloud::Async::InsightsResolutionsSync.any_instance.expects(:query_insights_resolutions).never
100
-
101
- ForemanTasks.sync_task(InsightsCloud::Async::InsightsResolutionsSync)
102
-
103
- assert_equal 0, InsightsResolution.all.count
104
- end
105
-
106
85
  test 'Skips pinging the cloud if no rule ids were found' do
107
- Katello::UpstreamConnectionChecker.any_instance.stubs(:can_connect?).returns(true)
108
86
  InsightsCloud::Async::InsightsResolutionsSync.any_instance.expects(:query_insights_resolutions).never
109
87
  InsightsRule.all.delete_all
110
88
 
@@ -112,30 +112,6 @@ class CloudRequestForwarderTest < ActiveSupport::TestCase
112
112
  assert_equal params.merge(:branch_id => 74), @forwarder.prepare_forward_params(req, 74)
113
113
  end
114
114
 
115
- test 'should NOT add branch id into forwarded params for compliance urls' do
116
- user_agent = { :foo => :bar }
117
- params = { :page => 5, :per_page => 42 }
118
-
119
- uris = [
120
- "/redhat_access/r/insights/platform/compliance/v2/systems/MyUUID/policies",
121
- "/redhat_access/r/insights/platform/compliance/v2/policies/MyUUID",
122
- "/redhat_access/r/insights/platform/compliance/v2/systems/MyUUID",
123
- "/redhat_access/r/insights/platform/compliance/v2/policies",
124
- "/redhat_access/r/insights/platform/compliance/v2/",
125
- ]
126
- uris.each do |uri|
127
- req = ActionDispatch::Request.new(
128
- 'REQUEST_URI' => uri,
129
- 'REQUEST_METHOD' => 'GET',
130
- 'HTTP_USER_AGENT' => user_agent,
131
- 'rack.input' => ::Puma::NullIO.new,
132
- 'action_dispatch.request.query_parameters' => params
133
- )
134
- req.stubs(:path).returns(uri)
135
- refute @forwarder.prepare_forward_params(req, 74).key?(:branch_id), "Branch id should not be added for #{uri}"
136
- end
137
- end
138
-
139
115
  test 'should reuse BranchInfo identifiers for user_agent' do
140
116
  user_agent = { :foo => :bar }
141
117
  params = { :page => 5, :per_page => 42 }
@@ -594,7 +594,7 @@ class SliceGeneratorTest < ActiveSupport::TestCase
594
594
  assert_equal '00000000-0000-0000-0000-000000000000', actual['report_slice_id']
595
595
  assert_not_nil(actual_host = actual['hosts'].first)
596
596
  assert_not_nil(actual_profile = actual_host['system_profile'])
597
- assert_equal 'google', actual_profile['cloud_provider']
597
+ assert_equal 'gcp', actual_profile['cloud_provider']
598
598
  end
599
599
 
600
600
  test 'Identifies Azure cloud provider' do
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: 9.0.61
4
+ version: 10.0.1
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: 2025-06-05 00:00:00.000000000 Z
11
+ date: 2024-06-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: foreman_ansible
@@ -28,16 +28,16 @@ dependencies:
28
28
  name: foreman-tasks
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 9.0.0
33
+ version: '0'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: 9.0.0
40
+ version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: katello
43
43
  requirement: !ruby/object:Gem::Requirement