katello 4.11.0.rc2 → 4.11.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of katello might be problematic. Click here for more details.

Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/katello/api/rhsm/candlepin_proxies_controller.rb +15 -2
  3. data/app/lib/katello/util/cvecf_migrator.rb +34 -0
  4. data/app/models/katello/concerns/host_managed_extensions.rb +9 -4
  5. data/app/models/katello/concerns/smart_proxy_extensions.rb +21 -0
  6. data/app/models/katello/content.rb +1 -1
  7. data/app/services/katello/product_content_importer.rb +5 -45
  8. data/db/migrate/20220929204746_add_content_view_environment_content_facet.rb +37 -4
  9. data/lib/katello/version.rb +1 -1
  10. data/lib/katello.rb +1 -0
  11. data/package.json +1 -1
  12. data/webpack/components/Content/Details/ContentDetails.js +3 -3
  13. data/webpack/components/Content/Details/__tests__/__snapshots__/ContentDetails.test.js.snap +0 -4
  14. data/webpack/components/SelectOrg/SetOrganization.js +0 -1
  15. data/webpack/components/TooltipButton/TooltipButton.js +2 -2
  16. data/webpack/components/TooltipButton/__snapshots__/TooltipButton.test.js.snap +0 -3
  17. data/webpack/components/pf3Table/components/Table.js +0 -1
  18. data/webpack/scenes/ContentViews/Details/Repositories/RepoIcon.js +1 -1
  19. data/webpack/scenes/RedHatRepositories/__tests__/__snapshots__/RedHatRepositoriesPage.test.js.snap +0 -1
  20. data/webpack/scenes/RedHatRepositories/components/RecommendedRepositorySetsToggler.js +0 -1
  21. data/webpack/scenes/RedHatRepositories/components/RepositorySetRepositories.js +1 -1
  22. data/webpack/scenes/RedHatRepositories/components/__tests__/__snapshots__/RecommendedRepositorySetsToggler.test.js.snap +0 -1
  23. data/webpack/scenes/RedHatRepositories/components/__tests__/__snapshots__/RepositorySetRepositories.test.js.snap +0 -1
  24. data/webpack/scenes/RedHatRepositories/helpers.js +0 -2
  25. data/webpack/scenes/SmartProxy/AdditionalCapsuleContent.js +17 -9
  26. data/webpack/scenes/SmartProxy/ExpandedSmartProxyRepositories.js +3 -3
  27. data/webpack/scenes/SmartProxy/__tests__/SmartProxyContentTest.fixtures.json +7 -7
  28. data/webpack/scenes/Subscriptions/Details/SubscriptionDetails.js +4 -4
  29. data/webpack/scenes/Subscriptions/Details/__tests__/__snapshots__/SubscriptionDetails.test.js.snap +0 -4
  30. data/webpack/scenes/Subscriptions/Manifest/ManageManifestModal.js +4 -8
  31. data/webpack/scenes/Subscriptions/SubscriptionsPage.js +1 -1
  32. data/webpack/scenes/Subscriptions/UpstreamSubscriptions/UpstreamSubscriptionsPage.js +1 -2
  33. data/webpack/scenes/Subscriptions/UpstreamSubscriptions/__tests__/__snapshots__/UpstreamSubscriptionsPage.test.js.snap +0 -2
  34. data/webpack/scenes/Subscriptions/__tests__/__snapshots__/SubscriptionsPage.test.js.snap +0 -1
  35. data/webpack/scenes/Subscriptions/components/SubscriptionsToolbar/SubscriptionsToolbar.js +2 -5
  36. data/webpack/scenes/Subscriptions/components/SubscriptionsToolbar/__snapshots__/SubscriptionsToolbar.test.js.snap +0 -10
  37. metadata +5 -5
  38. data/app/views/katello/api/v2/content_export_incrementals/repository.json.rabl +0 -13
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 433a8593a741f5638a898ededc857123917474a8991e952bcbc1d37678c98d04
4
- data.tar.gz: 61bfe5a00a2f55a903ea30c55fe6961e1a3bc372b05708e59c832906107dda78
3
+ metadata.gz: 338456e8404dcc70c487c85c1d1ce10a52faf40c5ba3d19b6969250ec977cd93
4
+ data.tar.gz: eb9e87fddfde9dbe5c5cf8c094b2fad23d2128e96b360d2b2de0ee7a6e00e8c4
5
5
  SHA512:
6
- metadata.gz: c969a2b03825780d6b2858bca1d8a0df6e34e61b46d566cd712da7e37eb9576ec83ef22c728e1eb2be94e739050f58db2425c927b53663728b01acb9ce193ff9
7
- data.tar.gz: f36a05610cb992199bc7fd985354b525a3e098447d8c7550c94e18c69f137c01fa051a6fe1a5482acf754d025feede30b5b443dfa03030b2acc2f2758a92b6cb
6
+ metadata.gz: 73da7aa80f8aca8c4ffb4461d43d555418b13a1cbb4deddc13a3dda620a5572ae31049d890e03d9743b3854d0dc3027de8ac0933956c02250a80c679eb07a980
7
+ data.tar.gz: bbd2fa44e5938e913d958f89190d6091ae6d00a1a156f553ce1c5ddbd243f20872f48c340fb0eb9eca0c6d5e0f0b23820d9bc750dd0de6b3571b0578b716b1d7
@@ -276,7 +276,7 @@ module Katello
276
276
  end
277
277
 
278
278
  def get_content_source_id(hostname)
279
- proxies = SmartProxy.authorized.filter do |sp|
279
+ proxies = SmartProxy.unscoped.authorized.filter do |sp|
280
280
  hostname == URI.parse(sp.url).hostname
281
281
  end
282
282
  return nil if proxies.length != 1
@@ -474,7 +474,20 @@ module Katello
474
474
  def update_host_registered_through(host, headers)
475
475
  parent_host = get_parent_host(headers)
476
476
  host.subscription_facet.update_attribute(:registered_through, parent_host)
477
- content_source_id = get_content_source_id(parent_host)
477
+ set_host_content_source(host, parent_host)
478
+ end
479
+
480
+ def registering_thru_load_balancer?(hostname)
481
+ ::SmartProxy.behind_load_balancer(hostname).present?
482
+ end
483
+
484
+ def set_host_content_source(host, content_source_hostname)
485
+ content_source_id = get_content_source_id(content_source_hostname)
486
+ if registering_thru_load_balancer?(content_source_hostname)
487
+ Rails.logger.info "Host %s registered through load balancer %s" % [host.name, content_source_hostname]
488
+ content_source_id = ::SmartProxy.behind_load_balancer(content_source_hostname)&.first&.id
489
+ end
490
+ Rails.logger.warn "Host %s registered through unknown proxy %s" % [host.name, content_source_hostname] if content_source_id.nil?
478
491
  host.content_facet.update_attribute(:content_source_id, content_source_id)
479
492
  end
480
493
 
@@ -0,0 +1,34 @@
1
+ module Katello
2
+ module Util
3
+ class CVECFMigrator # used in db/migrate/20220929204746_add_content_view_environment_content_facet.rb
4
+ def execute!
5
+ hosts_with_no_cve = []
6
+ hosts_with_missing_cve = []
7
+
8
+ ::Host::Managed.all.each do |host|
9
+ next if host.content_facet.blank?
10
+ if ::Katello::ContentView.exists?(id: host.content_facet.content_view_id) && ::Katello::KTEnvironment.exists?(host.content_facet.lifecycle_environment_id)
11
+ cve = ::Katello::ContentViewEnvironment.find_by(content_view_id: host.content_facet.content_view_id, environment_id: host.content_facet.lifecycle_environment_id)
12
+ if cve.blank?
13
+ hosts_with_no_cve << host
14
+ end
15
+ else
16
+ hosts_with_missing_cve << host
17
+ end
18
+ end
19
+
20
+ if hosts_with_missing_cve.present? || hosts_with_no_cve.present?
21
+ Rails.logger.warn "Found #{hosts_with_no_cve.count} hosts whose lifecycle environment does not have a corresponding ContentViewEnvironment"
22
+ Rails.logger.warn "Found #{hosts_with_missing_cve.count} hosts whose content facet is missing either content_view_id or lifecycle_environment_id"
23
+ Rails.logger.info "You may want to change the content view / lifecycle environment for these hosts manually."
24
+ end
25
+ (hosts_with_no_cve + hosts_with_missing_cve).each do |host|
26
+ default_content_view = host.organization.default_content_view
27
+ library = host.organization.library
28
+ Rails.logger.info "Updating host #{host.name} with default content_view_id and lifecycle_environment_id"
29
+ host.content_facet&.update_columns(content_view_id: default_content_view&.id, lifecycle_environment_id: library&.id)
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -91,12 +91,17 @@ module Katello
91
91
 
92
92
  def remote_execution_proxies(provider, *_rest)
93
93
  proxies = super
94
- if (name = subscription_facet&.registered_through)
95
- registered_through = SmartProxy.with_features(provider)
94
+ name = subscription_facet&.registered_through
95
+ result = []
96
+ if name.present?
97
+ result = SmartProxy.with_features(provider)
96
98
  .authorized
97
99
  .where(name: name)
100
+ if result.blank?
101
+ result = SmartProxy.authorized.behind_load_balancer(name)
102
+ end
98
103
  end
99
- proxies[:registered_through] = registered_through || []
104
+ proxies[:registered_through] = result
100
105
  proxies
101
106
  end
102
107
  end
@@ -193,7 +198,7 @@ module Katello
193
198
  property :content_views, 'ContentView', desc: 'Returns content views associated with the host'
194
199
  property :installed_packages, array_of: 'InstalledPackage', desc: 'Returns a list of packages installed on the host'
195
200
  end
196
- end
201
+ end # of included block
197
202
 
198
203
  def check_host_registration
199
204
  if subscription_facet
@@ -68,6 +68,18 @@ module Katello
68
68
  }
69
69
  scope :with_content, -> { with_features(PULP_FEATURE, PULP_NODE_FEATURE, PULP3_FEATURE) }
70
70
 
71
+ def self.load_balanced
72
+ proxies = unscoped.with_content # load balancing is only supported for pulp proxies
73
+ ids = proxies.select { |proxy| proxy.load_balanced? }.map(&:id)
74
+ proxies.where(id: ids)
75
+ end
76
+
77
+ def self.behind_load_balancer(load_balancer_hostname)
78
+ proxies = unscoped.with_content
79
+ ids = proxies.select { |proxy| proxy.load_balanced? && proxy.registration_host == load_balancer_hostname }.map(&:id)
80
+ proxies.where(id: ids)
81
+ end
82
+
71
83
  def self.with_repo(repo)
72
84
  joins(:capsule_lifecycle_environments).
73
85
  where("#{Katello::CapsuleLifecycleEnvironment.table_name}.lifecycle_environment_id" => repo.environment_id)
@@ -121,6 +133,15 @@ module Katello
121
133
  SmartProxy.joins(:smart_proxy_alternate_content_sources).where('katello_smart_proxy_alternate_content_sources.smart_proxy_id' => self.id)
122
134
  end
123
135
 
136
+ def registration_host
137
+ url = self.setting('Registration', 'registration_url').presence || self.url
138
+ URI.parse(url).host
139
+ end
140
+
141
+ def load_balanced?
142
+ URI.parse(self.url).host != self.registration_host
143
+ end
144
+
124
145
  def update_content_counts!
125
146
  # {:content_view_versions=>{87=>{:repositories=>{1=>{:metadata=>{},:counts=>{:rpms=>98, :module_streams=>9898}}}}}
126
147
  new_content_counts = { content_view_versions: {} }
@@ -50,7 +50,7 @@ module Katello
50
50
  cp_products = ::Katello::Resources::Candlepin::Product.all(org.label, [:id, :productContent])
51
51
  product_hash = cp_products.group_by { |prod| prod['id'] }
52
52
 
53
- prod_content_importer = Katello::ProductContentImporter.new(product_hash)
53
+ prod_content_importer = Katello::ProductContentImporter.new(cp_products)
54
54
  org.products.each do |product|
55
55
  product_json = product_hash[product.cp_id]&.first
56
56
 
@@ -21,46 +21,6 @@ module Katello
21
21
  # "enabled":false
22
22
  # }
23
23
  #
24
- #Example cp_products json structure (key:values where values are arrays and productContent is an array of contents inside value array)
25
- # {
26
- # "230"=>
27
- # [{"id"=>"230",
28
- # "productContent"=>
29
- # [{"content"=>
30
- # {"created"=>"2023-11-01T18:02:54+0000",
31
- # "updated"=>"2023-11-01T18:02:54+0000",
32
- # "uuid"=>"ff8080818b715841018b8c0d76d90190",
33
- # "id"=>"3996",
34
- # "type"=>"yum",
35
- # "label"=>"rhel-7-server-rt-htb-rpms",
36
- # "name"=>"Red Hat Enterprise Linux for Real Time HTB (RHEL 7 Server) (RPMs)",
37
- # "vendor"=>"Red Hat",
38
- # "contentUrl"=>"/content/htb/rhel/server/7/$basearch/rt/os",
39
- # "requiredTags"=>"rhel-7-server",
40
- # "releaseVer"=>nil,
41
- # "gpgUrl"=>"file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-beta,file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release",
42
- # "modifiedProductIds"=>[],
43
- # "arches"=>nil,
44
- # "metadataExpire"=>1},
45
- # "enabled"=>false},
46
- # {"content"=>
47
- # {"created"=>"2023-11-01T18:02:54+0000",
48
- # "updated"=>"2023-11-01T18:02:54+0000",
49
- # "uuid"=>"ff8080818b715841018b8c0d76d90181",
50
- # "id"=>"2165",
51
- # "type"=>"yum",
52
- # "label"=>"rhel-7-server-optional-htb-debug-rpms",
53
- # "name"=>"Red Hat Enterprise Linux 7 Server - Optional HTB (Debug RPMs)",
54
- # "vendor"=>"Red Hat",
55
- # "contentUrl"=>"/content/htb/rhel/server/7/$basearch/optional/debug",
56
- # "requiredTags"=>"rhel-7-server",
57
- # "releaseVer"=>nil,
58
- # "gpgUrl"=>"file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-beta,file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release",
59
- # "modifiedProductIds"=>[],
60
- # "arches"=>nil,
61
- # "metadataExpire"=>1},
62
- # "enabled"=>false}]}]
63
- # }
64
24
  attr_reader :content_url_updated
65
25
 
66
26
  def initialize(cp_products = [])
@@ -76,13 +36,13 @@ module Katello
76
36
  end
77
37
 
78
38
  def find_product_for_content(content_id)
79
- #Hash.find converts hash into enumerable iterating over each key,value pair which we can capture based on find result
80
- cp_product_id, __cp_product_value = @cp_products.find do |prod_json|
81
- prod_json&.last&.first&.[]('productContent')&.any? do |product_content_json|
82
- product_content_json["content"]["id"] == content_id
39
+ prod = @cp_products.find do |prod_json|
40
+ next if prod_json&.[]('productContent').blank?
41
+ prod_json['productContent'].any? do |product_content_json|
42
+ product_content_json&.dig("content", "id") == content_id
83
43
  end
84
44
  end
85
- ::Katello::Product.find_by(cp_id: cp_product_id)
45
+ ::Katello::Product.find_by(cp_id: prod["id"]) if prod
86
46
  end
87
47
 
88
48
  def fetch_product_contents_to_move(product, prod_contents_json)
@@ -8,12 +8,13 @@ class AddContentViewEnvironmentContentFacet < ActiveRecord::Migration[6.1]
8
8
  t.references :content_view_environment, :null => false, :index => false, :foreign_key => { :to_table => 'katello_content_view_environments' }
9
9
  t.references :content_facet, :null => false, :index => false, :foreign_key => { :to_table => 'katello_content_facets' }
10
10
  end
11
+ ::Katello::Util::CVECFMigrator.new.execute!
11
12
  FakeContentFacet.all.each do |content_facet|
12
13
  cve_id = ::Katello::KTEnvironment.find(content_facet.lifecycle_environment_id)
13
14
  .content_view_environments
14
15
  .find_by(content_view_id: content_facet.content_view_id)
15
- .id
16
- unless ::Katello::ContentViewEnvironmentContentFacet.create(
16
+ &.id
17
+ unless cve_id.present? && ::Katello::ContentViewEnvironmentContentFacet.create(
17
18
  content_facet_id: content_facet.id,
18
19
  content_view_environment_id: cve_id
19
20
  )
@@ -39,14 +40,46 @@ class AddContentViewEnvironmentContentFacet < ActiveRecord::Migration[6.1]
39
40
 
40
41
  ::Katello::ContentViewEnvironmentContentFacet.all.each do |cvecf|
41
42
  content_facet = cvecf.content_facet
42
- content_facet.content_view_id = cvecf.content_view_environment.content_view_id
43
- content_facet.lifecycle_environment_id = cvecf.content_view_environment.environment_id
43
+ cve = cvecf.content_view_environment
44
+ default_org = cve.environment&.organization
45
+ default_cv_id = default_org&.default_content_view&.id
46
+ default_lce_id = default_org&.library&.id
47
+ cv_id = cvecf.content_view_environment.content_view_id || default_cv_id
48
+ lce_id = cvecf.content_view_environment.environment_id || default_lce_id
49
+ say "Updating content_facet #{content_facet.id} with cv_id #{cv_id} and lce_id #{lce_id}"
50
+ content_facet.content_view_id = cv_id
51
+ content_facet.lifecycle_environment_id = lce_id
44
52
  content_facet.save(validate: false)
45
53
  end
46
54
 
55
+ ensure_no_null_cv_lce
47
56
  change_column :katello_content_facets, :content_view_id, :integer, :null => false
48
57
  change_column :katello_content_facets, :lifecycle_environment_id, :integer, :null => false
49
58
 
50
59
  drop_table :katello_content_view_environment_content_facets
51
60
  end
61
+
62
+ def ensure_no_null_cv_lce
63
+ # The following is to try to prevent PG::NotNullViolation: ERROR: column "content_view_id" contains null values
64
+ # since we add null constraints to the columns in the next step
65
+ content_facets_without_cv = ::Katello::Host::ContentFacet.where(content_view_id: nil)
66
+ if content_facets_without_cv.any?
67
+ say "Found #{content_facets_without_cv.count} content_facets with nil content_view_id"
68
+ content_facets_without_cv.each do |content_facet|
69
+ say "reassigning bad content_facet #{content_facet.id} to default content view"
70
+ content_facet.content_view_id = content_facet.host&.organization&.default_content_view&.id
71
+ content_facet.save(validate: false)
72
+ end
73
+ end
74
+
75
+ content_facets_without_lce = ::Katello::Host::ContentFacet.where(lifecycle_environment_id: nil)
76
+ if content_facets_without_lce.any?
77
+ say "Found #{content_facets_without_lce.count} content_facets with nil lifecycle_environment_id"
78
+ content_facets_without_lce.each do |content_facet|
79
+ say "reassigning bad content_facet #{content_facet.id} to default lifecycle environment"
80
+ content_facet.lifecycle_environment_id = content_facet.host&.organization&.library&.id
81
+ content_facet.save(validate: false)
82
+ end
83
+ end
84
+ end
52
85
  end
@@ -1,3 +1,3 @@
1
1
  module Katello
2
- VERSION = "4.11.0.rc2".freeze
2
+ VERSION = "4.11.0".freeze
3
3
  end
data/lib/katello.rb CHANGED
@@ -6,6 +6,7 @@ require "rabl"
6
6
  require "oauth"
7
7
  require "gettext_i18n_rails"
8
8
  require "foreman-tasks"
9
+ require "foreman_remote_execution"
9
10
  require "rest_client"
10
11
  require "anemone"
11
12
  require "securerandom"
data/package.json CHANGED
@@ -31,7 +31,7 @@
31
31
  "@testing-library/user-event": "^13.5.0",
32
32
  "@theforeman/builder": ">= 6.0.0",
33
33
  "@theforeman/find-foreman": "^4.8.0",
34
- "@theforeman/eslint-plugin-rules": "^12.0.1",
34
+ "@theforeman/eslint-plugin-rules": "^12.2.0",
35
35
  "axios-mock-adapter": "^1.10.0",
36
36
  "eslint": "^6.2.2",
37
37
  "eslint-config-airbnb": "^16.0.0",
@@ -10,7 +10,7 @@ const ContentDetails = (props) => {
10
10
 
11
11
  const tabHeaders = () => {
12
12
  const tabs = schema.map(node => (
13
- <NavItem key={node.key} eventKey={node.key} ouiaId={`${node.key}-nav-item`}>
13
+ <NavItem key={node.key} eventKey={node.key}>
14
14
  <div>{node.tabHeader}</div>
15
15
  </NavItem>
16
16
  ));
@@ -40,12 +40,12 @@ const ContentDetails = (props) => {
40
40
  <Grid>
41
41
  <Row>
42
42
  <Col sm={12}>
43
- <Nav id="content-nav-container" bsClass="nav nav-tabs" ouiaId="content-details-nav">
43
+ <Nav id="content-nav-container" bsClass="nav nav-tabs">
44
44
  {schema && tabHeaders()}
45
45
  </Nav>
46
46
  </Col>
47
47
  </Row>
48
- <TabContent animation={false} ouiaId="content-details-tab-content">
48
+ <TabContent animation={false}>
49
49
  {schema && tabPanes()}
50
50
  </TabContent>
51
51
  </Grid>
@@ -35,7 +35,6 @@ exports[`Content Details Info should render and contain appropriate components 1
35
35
  bsClass="nav nav-tabs"
36
36
  id="content-nav-container"
37
37
  justified={false}
38
- ouiaId="content-details-nav"
39
38
  pullLeft={false}
40
39
  pullRight={false}
41
40
  stacked={false}
@@ -45,7 +44,6 @@ exports[`Content Details Info should render and contain appropriate components 1
45
44
  disabled={false}
46
45
  eventKey={1}
47
46
  key="1"
48
- ouiaId="1-nav-item"
49
47
  >
50
48
  <div>
51
49
  Details
@@ -56,7 +54,6 @@ exports[`Content Details Info should render and contain appropriate components 1
56
54
  disabled={false}
57
55
  eventKey={2}
58
56
  key="2"
59
- ouiaId="2-nav-item"
60
57
  >
61
58
  <div>
62
59
  Repositories
@@ -70,7 +67,6 @@ exports[`Content Details Info should render and contain appropriate components 1
70
67
  bsClass="tab"
71
68
  componentClass="div"
72
69
  mountOnEnter={false}
73
- ouiaId="content-details-tab-content"
74
70
  unmountOnExit={false}
75
71
  >
76
72
  <TabPane
@@ -74,7 +74,6 @@ class SetOrganization extends Component {
74
74
  <div className="col-sm-3">
75
75
  <a href={`/organizations/${id}/select`}>
76
76
  <Button
77
- ouiaId="select-org-button"
78
77
  disabled={this.state.disabled}
79
78
  className="btn btn-primary"
80
79
  onClick={this.onSend}
@@ -6,7 +6,7 @@ import './TooltipButton.scss';
6
6
  const TooltipButton = ({
7
7
  disabled, title, tooltipText, tooltipId, tooltipPlacement, renderedButton, ...props
8
8
  }) => {
9
- if (!disabled) return renderedButton || (<Button {...props} ouiaId="tooltip-button">{title}</Button>);
9
+ if (!disabled) return renderedButton || (<Button {...props}>{title}</Button>);
10
10
  return (
11
11
  <OverlayTrigger
12
12
  placement={tooltipPlacement}
@@ -14,7 +14,7 @@ const TooltipButton = ({
14
14
  overlay={<Tooltip id={tooltipId}>{tooltipText}</Tooltip>}
15
15
  >
16
16
  <div className="tooltip-button-helper">
17
- {renderedButton || (<Button {...props} disabled ouiaId="tooltip-disabled-button">{title}</Button>)}
17
+ {renderedButton || (<Button {...props} disabled>{title}</Button>)}
18
18
  </div>
19
19
  </OverlayTrigger>
20
20
  );
@@ -30,7 +30,6 @@ exports[`TooltipButton renders disabled TooltipButton 1`] = `
30
30
  bsClass="btn"
31
31
  bsStyle="default"
32
32
  disabled={true}
33
- ouiaId="tooltip-disabled-button"
34
33
  >
35
34
  some-title
36
35
  </Button>
@@ -74,7 +73,6 @@ exports[`TooltipButton renders enabled TooltipButton 1`] = `
74
73
  bsClass="btn"
75
74
  bsStyle="default"
76
75
  disabled={false}
77
- ouiaId="tooltip-button"
78
76
  >
79
77
  some-title
80
78
  </Button>
@@ -89,6 +87,5 @@ exports[`TooltipButton renders minimal TooltipButton 1`] = `
89
87
  bsClass="btn"
90
88
  bsStyle="default"
91
89
  disabled={false}
92
- ouiaId="tooltip-button"
93
90
  />
94
91
  `;
@@ -42,7 +42,6 @@ const Table = ({
42
42
  {body}
43
43
  </PfTable.PfProvider>
44
44
  {shouldRenderPagination && (
45
- // eslint-disable-next-line @theforeman/rules/require-ouiaid
46
45
  <Pagination
47
46
  itemCount={itemCount}
48
47
  onChange={onPaginationChange}
@@ -14,7 +14,7 @@ const RepoIcon = ({ type }) => {
14
14
  };
15
15
  const Icon = iconMap[type] || BoxIcon;
16
16
 
17
- return <Tooltip content={<div>{type}</div>}><Icon /></Tooltip>;
17
+ return <Tooltip content={<div>{type}</div>}><Icon aria-label={`${type}_type_icon`} /></Tooltip>;
18
18
  };
19
19
 
20
20
  RepoIcon.propTypes = {
@@ -119,7 +119,6 @@ exports[`RedHatRepositories page should render 1`] = `
119
119
  onChange={[Function]}
120
120
  onPerPageSelect={null}
121
121
  onSetPage={null}
122
- ouiaId="enabled-repos-pagination"
123
122
  page={1}
124
123
  perPage={null}
125
124
  updateParamsByUrl={true}
@@ -19,7 +19,6 @@ const RecommendedRepositorySetsToggler = ({
19
19
  return (
20
20
  <div className={classes} {...props}>
21
21
  <Switch
22
- ouiaId="enabled-repo-set-switch"
23
22
  bsSize="mini"
24
23
  value={enabled}
25
24
  onChange={() => onChange(!enabled)}
@@ -53,7 +53,7 @@ export class RepositorySetRepositories extends Component {
53
53
 
54
54
  if (data.error) {
55
55
  return (
56
- <Alert type="danger" ouiaId="repo-set-alert">
56
+ <Alert type="danger">
57
57
  <span>{data.error.displayMessage}</span>
58
58
  </Alert>
59
59
  );
@@ -19,7 +19,6 @@ exports[`RecommendedRepositorySetsToggler rendering renders recommended-reposito
19
19
  onChange={[Function]}
20
20
  onColor="primary"
21
21
  onText="ON"
22
- ouiaId="enabled-repo-set-switch"
23
22
  readonly={false}
24
23
  tristate={false}
25
24
  value={true}
@@ -18,7 +18,6 @@ exports[`RepositorySetRepositories Component should render with error 1`] = `
18
18
  <Alert
19
19
  className=""
20
20
  onDismiss={null}
21
- ouiaId="repo-set-alert"
22
21
  type="danger"
23
22
  >
24
23
  <span>
@@ -34,7 +34,6 @@ export const getSetsComponent = (repoSetsState, onPaginationChange) => {
34
34
  <ListView>
35
35
  <div className="sticky-pagination">
36
36
  <Pagination
37
- ouiaId="repos-pagination"
38
37
  itemCount={itemCount}
39
38
  onChange={onPaginationChange}
40
39
  isCompact
@@ -65,7 +64,6 @@ export const getEnabledComponent = (enabledReposState, onPaginationChange) => {
65
64
  <ListView>
66
65
  <div className="sticky-pagination sticky-pagination-grey">
67
66
  <Pagination
68
- ouiaId="enabled-repos-pagination"
69
67
  isCompact
70
68
  itemCount={itemCount}
71
69
  onChange={onPaginationChange}
@@ -1,16 +1,18 @@
1
1
  import React from 'react';
2
2
  import PropTypes from 'prop-types';
3
+ import { translate as __ } from 'foremanReact/common/I18n';
3
4
  import ContentConfig from '../Content/ContentConfig';
4
5
 
5
6
  const AdditionalCapsuleContent = ({ counts }) => {
6
7
  const {
7
8
  deb: debPackageCount = 0,
8
9
  docker_manifest: dockerManifestCount = 0,
10
+ docker_manifest_list: dockerManifestListCount = 0,
9
11
  docker_tag: dockerTagCount = 0,
10
12
  file: fileCount = 0,
11
13
  erratum: errataCount = 0,
12
14
  package_group: packageGroup = 0,
13
- 'rpm.modulemd': moduleStreamCount = 0,
15
+ module_stream: moduleStreamCount = 0,
14
16
  } = counts;
15
17
 
16
18
  const contentConfigTypes = ContentConfig.filter(({ names: { capsuleCountLabel } }) =>
@@ -32,37 +34,42 @@ const AdditionalCapsuleContent = ({ counts }) => {
32
34
  <>
33
35
  {errataCount > 0 &&
34
36
  <>
35
- {`${errataCount} Errata`}<br />
37
+ {`${errataCount} ${__('Errata')}`}<br />
36
38
  </>
37
39
  }
38
40
  {moduleStreamCount > 0 &&
39
41
  <>
40
- {`${moduleStreamCount} Module streams`}<br />
42
+ {`${moduleStreamCount} ${__('Module streams')}`}<br />
41
43
  </>
42
44
  }
43
45
  {packageGroup > 0 &&
44
46
  <>
45
- {`${packageGroup} Package groups`}<br />
47
+ {`${packageGroup} ${__('Package groups')}`}<br />
46
48
  </>
47
49
  }
48
50
  {dockerTagCount > 0 &&
49
51
  <>
50
- {`${dockerTagCount} Container tags`}<br />
52
+ {`${dockerTagCount} ${__('Container tags')}`}<br />
51
53
  </>
52
54
  }
53
55
  {dockerManifestCount > 0 &&
54
56
  <>
55
- {`${dockerManifestCount} Container manifests`}<br />
57
+ {`${dockerManifestCount} ${__('Container manifests')}`}<br />
56
58
  </>
57
59
  }
60
+ {dockerManifestListCount > 0 &&
61
+ <>
62
+ {`${dockerManifestListCount} ${__('Container manifest lists')}`}<br />
63
+ </>
64
+ }
58
65
  {fileCount > 0 &&
59
66
  <>
60
- {`${fileCount} Files`}<br />
67
+ {`${fileCount} ${__('Files')}`}<br />
61
68
  </>
62
69
  }
63
70
  {debPackageCount > 0 &&
64
71
  <>
65
- {`${debPackageCount} Debian packages`}<br />
72
+ {`${debPackageCount} ${__('Debian packages')}`}<br />
66
73
  </>}
67
74
  {contentConfigTypes?.length > 0 &&
68
75
  contentConfigTypes.map(({ count, pluralLowercase }) => (
@@ -78,11 +85,12 @@ AdditionalCapsuleContent.propTypes = {
78
85
  counts: PropTypes.shape({
79
86
  deb: PropTypes.number,
80
87
  docker_manifest: PropTypes.number,
88
+ docker_manifest_list: PropTypes.number,
81
89
  docker_tag: PropTypes.number,
82
90
  file: PropTypes.number,
83
91
  erratum: PropTypes.number,
84
92
  package_group: PropTypes.number,
85
- 'rpm.modulemd': PropTypes.number,
93
+ module_stream: PropTypes.number,
86
94
  }),
87
95
  };
88
96
 
@@ -31,8 +31,8 @@ const ExpandedSmartProxyRepositories = ({
31
31
  const cellList = [];
32
32
  /* eslint-disable max-len */
33
33
  cellList.push(<DataListCell key={`${repo.id}-name`}><span><a href={`/products/${envContentCounts[repo].metadata.product_id}/repositories/${envContentCounts[repo].metadata.library_instance_id}/`}>{getRepositoryNameById(envContentCounts[repo].metadata.library_instance_id)}</a></span></DataListCell>);
34
- cellList.push(<DataListCell key={`${repo.id}-type`}><RepoIcon type={envContentCounts[repo].metadata.content_type} /></DataListCell>);
35
- cellList.push(<DataListCell key={`${repo.id}-rpm`}><span>{envContentCounts[repo].counts.rpm ? `${envContentCounts[repo].counts.rpm} Packages` : 'N/A'}</span></DataListCell>);
34
+ cellList.push(<DataListCell key={`${repo.id}-type`}><RepoIcon type={envContentCounts[repo].metadata.content_type} identifier={repo.id} /></DataListCell>);
35
+ cellList.push(<DataListCell key={`${repo.id}-rpm`}><span>{envContentCounts[repo].counts.rpm ? `${envContentCounts[repo].counts.rpm} ${__('Packages')}` : 'N/A'}</span></DataListCell>);
36
36
  cellList.push(<DataListCell key={`${repo.id}-count`}><AdditionalCapsuleContent counts={envContentCounts[repo].counts} /></DataListCell>);
37
37
  /* eslint-enable max-len */
38
38
  return cellList;
@@ -42,7 +42,7 @@ const ExpandedSmartProxyRepositories = ({
42
42
  const cellList = [];
43
43
  /* eslint-disable max-len */
44
44
  cellList.push(<DataListCell key={`${repo.id}-name`}><span><a href={`/products/${repo.product_id}/repositories/${repo.library_id}/`}>{repo.name}</a></span></DataListCell>);
45
- cellList.push(<DataListCell key={`${repo.id}-type`}><RepoIcon type={repo.content_type} /></DataListCell>);
45
+ cellList.push(<DataListCell key={`${repo.id}-type`}><RepoIcon type={repo.content_type} identifier={repo.id} /></DataListCell>);
46
46
  cellList.push(<DataListCell key={`${repo.id}-rpm`}><span><InactiveText text="N/A" /></span></DataListCell>);
47
47
  cellList.push(<DataListCell key={`${repo.id}-count`}><InactiveText text="N/A" /></DataListCell>);
48
48
  /* eslint-enable max-len */
@@ -496,7 +496,7 @@
496
496
  "package_group": 2,
497
497
  "rpm.packagecategory": 1,
498
498
  "rpm.distribution_tree": 1,
499
- "rpm.modulemd_defaults": 3
499
+ "module_stream": 3
500
500
  },
501
501
  "metadata": {
502
502
  "env_id": 2,
@@ -529,7 +529,7 @@
529
529
  "counts": {
530
530
  "rpm": 22,
531
531
  "erratum": 7,
532
- "rpm.modulemd": 14,
532
+ "module_stream": 14,
533
533
  "package_group": 2,
534
534
  "rpm.packagecategory": 1,
535
535
  "rpm.distribution_tree": 1,
@@ -586,7 +586,7 @@
586
586
  "counts": {
587
587
  "rpm": 22,
588
588
  "erratum": 7,
589
- "rpm.modulemd": 14,
589
+ "module_stream": 14,
590
590
  "package_group": 2,
591
591
  "rpm.packagecategory": 1,
592
592
  "rpm.distribution_tree": 1,
@@ -638,7 +638,7 @@
638
638
  "counts": {
639
639
  "rpm": 22,
640
640
  "erratum": 7,
641
- "rpm.modulemd": 14,
641
+ "module_stream": 14,
642
642
  "package_group": 2,
643
643
  "rpm.packagecategory": 1,
644
644
  "rpm.distribution_tree": 1,
@@ -704,7 +704,7 @@
704
704
  "counts": {
705
705
  "rpm": 22,
706
706
  "erratum": 7,
707
- "rpm.modulemd": 14,
707
+ "module_stream": 14,
708
708
  "package_group": 2,
709
709
  "rpm.packagecategory": 1,
710
710
  "rpm.distribution_tree": 1,
@@ -756,7 +756,7 @@
756
756
  "counts": {
757
757
  "rpm": 14,
758
758
  "erratum": 6,
759
- "rpm.modulemd": 14,
759
+ "module_stream": 14,
760
760
  "rpm.distribution_tree": 1,
761
761
  "rpm.modulemd_defaults": 3
762
762
  },
@@ -776,7 +776,7 @@
776
776
  "counts": {
777
777
  "rpm": 14,
778
778
  "erratum": 6,
779
- "rpm.modulemd": 14,
779
+ "module_stream": 14,
780
780
  "rpm.distribution_tree": 1,
781
781
  "rpm.modulemd_defaults": 3
782
782
  },
@@ -78,16 +78,16 @@ class SubscriptionDetails extends Component {
78
78
  <TabContainer id="subscription-tabs-container" defaultActiveKey={1}>
79
79
  <div>
80
80
  <LoadingState loading={subscriptionDetails.loading} loadingText={__('Loading')}>
81
- <Nav bsClass="nav nav-tabs" ouiaId="subscription-details-nav">
82
- <NavItem eventKey={1} ouiaId="details-nav-item">
81
+ <Nav bsClass="nav nav-tabs">
82
+ <NavItem eventKey={1}>
83
83
  <div>{__('Details')}</div>
84
84
  </NavItem>
85
- <NavItem eventKey={2} ouiaId="product-content-nav-item">
85
+ <NavItem eventKey={2}>
86
86
  <div>{__('Product Content')}</div>
87
87
  </NavItem>
88
88
  </Nav>
89
89
  <Grid bsClass="container-fluid">
90
- <TabContent ouiaId="subscription-details-tab-content" animation={false}>
90
+ <TabContent animation={false}>
91
91
  <TabPane eventKey={1}>
92
92
  <div>
93
93
  <Row>
@@ -40,7 +40,6 @@ exports[`subscriptions details page should render and contain appropiate compone
40
40
  <Nav
41
41
  bsClass="nav nav-tabs"
42
42
  justified={false}
43
- ouiaId="subscription-details-nav"
44
43
  pullLeft={false}
45
44
  pullRight={false}
46
45
  stacked={false}
@@ -49,7 +48,6 @@ exports[`subscriptions details page should render and contain appropiate compone
49
48
  active={false}
50
49
  disabled={false}
51
50
  eventKey={1}
52
- ouiaId="details-nav-item"
53
51
  >
54
52
  <div>
55
53
  Details
@@ -59,7 +57,6 @@ exports[`subscriptions details page should render and contain appropiate compone
59
57
  active={false}
60
58
  disabled={false}
61
59
  eventKey={2}
62
- ouiaId="product-content-nav-item"
63
60
  >
64
61
  <div>
65
62
  Product Content
@@ -76,7 +73,6 @@ exports[`subscriptions details page should render and contain appropiate compone
76
73
  bsClass="tab"
77
74
  componentClass="div"
78
75
  mountOnEnter={false}
79
- ouiaId="subscription-details-tab-content"
80
76
  unmountOnExit={false}
81
77
  >
82
78
  <TabPane
@@ -129,10 +129,9 @@ class ManageManifestModal extends Component {
129
129
 
130
130
  return (
131
131
  <ForemanModal id={MANAGE_MANIFEST_MODAL_ID} title={__('Manage Manifest')}>
132
- <Tabs id="manifest-history-tabs" ouiaId="manifest-history-tabs">
132
+ <Tabs id="manifest-history-tabs">
133
133
  {showManifestTab &&
134
134
  <Tab
135
- ouiaId="subscription-manifest-tab"
136
135
  eventKey={1}
137
136
  title={__('Manifest')}
138
137
  >
@@ -199,10 +198,10 @@ class ManageManifestModal extends Component {
199
198
  <ForemanModal title={__('Confirm delete manifest')} id={DELETE_MANIFEST_MODAL_ID}>
200
199
  <DeleteManifestModalText simpleContentAccess={simpleContentAccess} />
201
200
  <ForemanModal.Footer>
202
- <Button ouiaId="cancel-button" bsStyle="default" onClick={this.hideDeleteManifestModal}>
201
+ <Button bsStyle="default" onClick={this.hideDeleteManifestModal}>
203
202
  {__('Cancel')}
204
203
  </Button>
205
- <Button ouiaId="delete-button" bsStyle="danger" onClick={this.deleteManifest}>
204
+ <Button bsStyle="danger" onClick={this.deleteManifest}>
206
205
  {__('Delete')}
207
206
  </Button>
208
207
  </ForemanModal.Footer>
@@ -216,13 +215,11 @@ class ManageManifestModal extends Component {
216
215
  </Tab>
217
216
  }
218
217
  <Tab
219
- ouiaId="manifest-history-tab"
220
218
  eventKey={2}
221
219
  title={__('Manifest History')}
222
220
  >
223
221
  <LoadingState loading={manifestHistory.loading} loadingText={__('Loading')}>
224
222
  <Table
225
- ouiaId="manifest-history-table"
226
223
  rows={manifestHistory.results}
227
224
  columns={columns}
228
225
  emptyState={emptyStateData()}
@@ -231,7 +228,6 @@ class ManageManifestModal extends Component {
231
228
  </Tab>
232
229
  {showCdnConfigurationTab &&
233
230
  <Tab
234
- ouiaId="cdn-configuration-tab"
235
231
  eventKey={3}
236
232
  title={__('CDN Configuration')}
237
233
  >
@@ -248,7 +244,7 @@ class ManageManifestModal extends Component {
248
244
  }
249
245
  </Tabs>
250
246
  <ForemanModal.Footer>
251
- <Button ouiaId="close-button" bsStyle="primary" onClick={this.hideModal}>
247
+ <Button bsStyle="primary" onClick={this.hideModal}>
252
248
  {__('Close')}
253
249
  </Button>
254
250
  </ForemanModal.Footer>
@@ -222,7 +222,7 @@ class SubscriptionsPage extends Component {
222
222
  };
223
223
 
224
224
  const SCAAlert = (
225
- <Alert ouiaId="sca-alert" type="warning">
225
+ <Alert type="warning">
226
226
  <FormattedMessage
227
227
  id="sca-alert"
228
228
  values={{
@@ -132,7 +132,6 @@ class UpstreamSubscriptionsPage extends Component {
132
132
  <Row>
133
133
  <Col sm={12}>
134
134
  <Button
135
- ouiaId="submit-button"
136
135
  style={{ marginTop: '10px', marginRight: '5px' }}
137
136
  bsStyle="primary"
138
137
  type="submit"
@@ -144,7 +143,7 @@ class UpstreamSubscriptionsPage extends Component {
144
143
  </Button>
145
144
 
146
145
  <LinkContainer to="/subscriptions" style={{ marginTop: '10px' }}>
147
- <Button ouiaId="cancel-button">
146
+ <Button>
148
147
  {__('Cancel')}
149
148
  </Button>
150
149
  </LinkContainer>
@@ -191,7 +191,6 @@ exports[`upstream subscriptions page should render 1`] = `
191
191
  bsStyle="primary"
192
192
  disabled={true}
193
193
  onClick={[Function]}
194
- ouiaId="submit-button"
195
194
  style={
196
195
  Object {
197
196
  "marginRight": "5px",
@@ -216,7 +215,6 @@ exports[`upstream subscriptions page should render 1`] = `
216
215
  bsClass="btn"
217
216
  bsStyle="default"
218
217
  disabled={false}
219
- ouiaId="cancel-button"
220
218
  >
221
219
  Cancel
222
220
  </Button>
@@ -78,7 +78,6 @@ exports[`subscriptions page should render 1`] = `
78
78
  <Alert
79
79
  className=""
80
80
  onDismiss={null}
81
- ouiaId="sca-alert"
82
81
  type="warning"
83
82
  >
84
83
  <FormattedMessage
@@ -74,14 +74,11 @@ const SubscriptionsToolbar = ({
74
74
  </a>
75
75
  }
76
76
 
77
- <Button ouiaId="manage-manifest-button" onClick={onManageManifestButtonClick}>
77
+ <Button onClick={onManageManifestButtonClick}>
78
78
  {__('Manage Manifest')}
79
79
  </Button>
80
80
 
81
- <Button
82
- ouiaId="export-csv-button"
83
- onClick={onExportCsvButtonClick}
84
- >
81
+ <Button onClick={onExportCsvButtonClick}>
85
82
  {__('Export CSV')}
86
83
  </Button>
87
84
  {canManageSubscriptionAllocations &&
@@ -72,7 +72,6 @@ exports[`SubscriptionsToolbar renders SubscriptionsToolbar 1`] = `
72
72
  bsStyle="default"
73
73
  disabled={false}
74
74
  onClick={[Function]}
75
- ouiaId="manage-manifest-button"
76
75
  >
77
76
  Manage Manifest
78
77
  </Button>
@@ -83,7 +82,6 @@ exports[`SubscriptionsToolbar renders SubscriptionsToolbar 1`] = `
83
82
  bsStyle="default"
84
83
  disabled={false}
85
84
  onClick={[Function]}
86
- ouiaId="export-csv-button"
87
85
  >
88
86
  Export CSV
89
87
  </Button>
@@ -166,7 +164,6 @@ exports[`SubscriptionsToolbar renders SubscriptionsToolbar with disabled add but
166
164
  bsStyle="default"
167
165
  disabled={false}
168
166
  onClick={[Function]}
169
- ouiaId="manage-manifest-button"
170
167
  >
171
168
  Manage Manifest
172
169
  </Button>
@@ -177,7 +174,6 @@ exports[`SubscriptionsToolbar renders SubscriptionsToolbar with disabled add but
177
174
  bsStyle="default"
178
175
  disabled={false}
179
176
  onClick={[Function]}
180
- ouiaId="export-csv-button"
181
177
  >
182
178
  Export CSV
183
179
  </Button>
@@ -260,7 +256,6 @@ exports[`SubscriptionsToolbar renders SubscriptionsToolbar with disabled delete
260
256
  bsStyle="default"
261
257
  disabled={false}
262
258
  onClick={[Function]}
263
- ouiaId="manage-manifest-button"
264
259
  >
265
260
  Manage Manifest
266
261
  </Button>
@@ -271,7 +266,6 @@ exports[`SubscriptionsToolbar renders SubscriptionsToolbar with disabled delete
271
266
  bsStyle="default"
272
267
  disabled={false}
273
268
  onClick={[Function]}
274
- ouiaId="export-csv-button"
275
269
  >
276
270
  Export CSV
277
271
  </Button>
@@ -354,7 +348,6 @@ exports[`SubscriptionsToolbar renders SubscriptionsToolbar with disabled manifes
354
348
  bsStyle="default"
355
349
  disabled={false}
356
350
  onClick={[Function]}
357
- ouiaId="manage-manifest-button"
358
351
  >
359
352
  Manage Manifest
360
353
  </Button>
@@ -365,7 +358,6 @@ exports[`SubscriptionsToolbar renders SubscriptionsToolbar with disabled manifes
365
358
  bsStyle="default"
366
359
  disabled={false}
367
360
  onClick={[Function]}
368
- ouiaId="export-csv-button"
369
361
  >
370
362
  Export CSV
371
363
  </Button>
@@ -466,7 +458,6 @@ exports[`SubscriptionsToolbar renders SubscriptionsToolbar with table columns 1`
466
458
  bsStyle="default"
467
459
  disabled={false}
468
460
  onClick={[Function]}
469
- ouiaId="manage-manifest-button"
470
461
  >
471
462
  Manage Manifest
472
463
  </Button>
@@ -477,7 +468,6 @@ exports[`SubscriptionsToolbar renders SubscriptionsToolbar with table columns 1`
477
468
  bsStyle="default"
478
469
  disabled={false}
479
470
  onClick={[Function]}
480
- ouiaId="export-csv-button"
481
471
  >
482
472
  Export CSV
483
473
  </Button>
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: katello
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.11.0.rc2
4
+ version: 4.11.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - N/A
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-12-07 00:00:00.000000000 Z
11
+ date: 2023-12-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -1164,6 +1164,7 @@ files:
1164
1164
  - app/lib/katello/resources/registry.rb
1165
1165
  - app/lib/katello/util/candlepin_repository_checker.rb
1166
1166
  - app/lib/katello/util/cdn_var_substitutor.rb
1167
+ - app/lib/katello/util/cvecf_migrator.rb
1167
1168
  - app/lib/katello/util/data.rb
1168
1169
  - app/lib/katello/util/deduplication_migrator.rb
1169
1170
  - app/lib/katello/util/docker_manifest_clause_generator.rb
@@ -1599,7 +1600,6 @@ files:
1599
1600
  - app/views/katello/api/v2/common/update.json.rabl
1600
1601
  - app/views/katello/api/v2/content_credentials/index.json.rabl
1601
1602
  - app/views/katello/api/v2/content_credentials/show.json.rabl
1602
- - app/views/katello/api/v2/content_export_incrementals/repository.json.rabl
1603
1603
  - app/views/katello/api/v2/content_facet/base.json.rabl
1604
1604
  - app/views/katello/api/v2/content_facet/base_with_root.json.rabl
1605
1605
  - app/views/katello/api/v2/content_facet/erratum.json.rabl
@@ -5588,9 +5588,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
5588
5588
  version: '2.5'
5589
5589
  required_rubygems_version: !ruby/object:Gem::Requirement
5590
5590
  requirements:
5591
- - - ">"
5591
+ - - ">="
5592
5592
  - !ruby/object:Gem::Version
5593
- version: 1.3.1
5593
+ version: '0'
5594
5594
  requirements: []
5595
5595
  rubygems_version: 3.1.6
5596
5596
  signing_key:
@@ -1,13 +0,0 @@
1
- object @resource
2
-
3
- extends "katello/api/v2/common/metadata"
4
-
5
- node :nachos do
6
- attribute sandwich: 'sandwiches are delicious'
7
- end
8
-
9
- node :errors do
10
- #unless @resource.valid?
11
- attribute :messages => @resource.errors.full_messages
12
- #end
13
- end