katello 4.12.0 → 4.13.0.rc1

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 (239) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +0 -1
  3. data/app/assets/javascripts/katello/locale/bn/katello.js +3365 -3350
  4. data/app/assets/javascripts/katello/locale/bn_IN/katello.js +3136 -3121
  5. data/app/assets/javascripts/katello/locale/ca/katello.js +3588 -3576
  6. data/app/assets/javascripts/katello/locale/cs/katello.js +3499 -3487
  7. data/app/assets/javascripts/katello/locale/cs_CZ/katello.js +4186 -4186
  8. data/app/assets/javascripts/katello/locale/de/katello.js +5553 -5562
  9. data/app/assets/javascripts/katello/locale/de_AT/katello.js +3008 -2993
  10. data/app/assets/javascripts/katello/locale/de_DE/katello.js +3066 -3051
  11. data/app/assets/javascripts/katello/locale/el/katello.js +3376 -3370
  12. data/app/assets/javascripts/katello/locale/en/katello.js +3008 -2993
  13. data/app/assets/javascripts/katello/locale/en_GB/katello.js +3076 -3073
  14. data/app/assets/javascripts/katello/locale/en_US/katello.js +3008 -2993
  15. data/app/assets/javascripts/katello/locale/es/katello.js +5366 -5372
  16. data/app/assets/javascripts/katello/locale/et_EE/katello.js +3008 -2993
  17. data/app/assets/javascripts/katello/locale/fr/katello.js +5975 -5984
  18. data/app/assets/javascripts/katello/locale/gl/katello.js +3125 -3113
  19. data/app/assets/javascripts/katello/locale/gu/katello.js +3119 -3104
  20. data/app/assets/javascripts/katello/locale/he_IL/katello.js +3020 -3005
  21. data/app/assets/javascripts/katello/locale/hi/katello.js +3137 -3122
  22. data/app/assets/javascripts/katello/locale/id/katello.js +3008 -2993
  23. data/app/assets/javascripts/katello/locale/it/katello.js +4469 -4466
  24. data/app/assets/javascripts/katello/locale/ja/katello.js +5969 -5978
  25. data/app/assets/javascripts/katello/locale/ka/katello.js +5649 -5652
  26. data/app/assets/javascripts/katello/locale/kn/katello.js +3136 -3121
  27. data/app/assets/javascripts/katello/locale/ko/katello.js +4717 -4720
  28. data/app/assets/javascripts/katello/locale/locale/katello.js +1050 -1084
  29. data/app/assets/javascripts/katello/locale/ml_IN/katello.js +3008 -2993
  30. data/app/assets/javascripts/katello/locale/mr/katello.js +3136 -3121
  31. data/app/assets/javascripts/katello/locale/nl_NL/katello.js +3116 -3101
  32. data/app/assets/javascripts/katello/locale/or/katello.js +3137 -3122
  33. data/app/assets/javascripts/katello/locale/pa/katello.js +3136 -3121
  34. data/app/assets/javascripts/katello/locale/pl/katello.js +3210 -3195
  35. data/app/assets/javascripts/katello/locale/pl_PL/katello.js +3008 -2993
  36. data/app/assets/javascripts/katello/locale/pt/katello.js +3009 -2994
  37. data/app/assets/javascripts/katello/locale/pt_BR/katello.js +5362 -5368
  38. data/app/assets/javascripts/katello/locale/ro/katello.js +3008 -2993
  39. data/app/assets/javascripts/katello/locale/ro_RO/katello.js +3008 -2993
  40. data/app/assets/javascripts/katello/locale/ru/katello.js +4638 -4641
  41. data/app/assets/javascripts/katello/locale/sl/katello.js +3051 -3036
  42. data/app/assets/javascripts/katello/locale/sv_SE/katello.js +3156 -3144
  43. data/app/assets/javascripts/katello/locale/ta/katello.js +3365 -3350
  44. data/app/assets/javascripts/katello/locale/ta_IN/katello.js +3121 -3106
  45. data/app/assets/javascripts/katello/locale/te/katello.js +3136 -3121
  46. data/app/assets/javascripts/katello/locale/tr/katello.js +3025 -3010
  47. data/app/assets/javascripts/katello/locale/vi/katello.js +3008 -2993
  48. data/app/assets/javascripts/katello/locale/vi_VN/katello.js +3008 -2993
  49. data/app/assets/javascripts/katello/locale/zh/katello.js +3008 -2993
  50. data/app/assets/javascripts/katello/locale/zh_CN/katello.js +5968 -5977
  51. data/app/assets/javascripts/katello/locale/zh_TW/katello.js +4694 -4697
  52. data/app/assets/javascripts/katello/sync_management/sync_management.js +1 -0
  53. data/app/controllers/katello/api/registry/registry_proxies_controller.rb +51 -124
  54. data/app/controllers/katello/api/rhsm/candlepin_dynflow_proxy_controller.rb +12 -20
  55. data/app/controllers/katello/api/v2/activation_keys_controller.rb +10 -4
  56. data/app/controllers/katello/api/v2/capsule_content_controller.rb +24 -0
  57. data/app/controllers/katello/api/v2/content_view_versions_controller.rb +9 -2
  58. data/app/controllers/katello/api/v2/debs_controller.rb +1 -1
  59. data/app/controllers/katello/api/v2/errata_controller.rb +1 -1
  60. data/app/controllers/katello/api/v2/host_subscriptions_controller.rb +12 -4
  61. data/app/controllers/katello/api/v2/hosts_bulk_actions_controller.rb +3 -3
  62. data/app/controllers/katello/api/v2/organizations_controller.rb +0 -11
  63. data/app/controllers/katello/api/v2/packages_controller.rb +1 -1
  64. data/app/controllers/katello/api/v2/products_bulk_actions_controller.rb +1 -1
  65. data/app/controllers/katello/api/v2/repositories_controller.rb +18 -12
  66. data/app/controllers/katello/api/v2/repository_sets_controller.rb +2 -1
  67. data/app/controllers/katello/api/v2/simple_content_access_controller.rb +9 -22
  68. data/app/controllers/katello/concerns/api/v2/authorization.rb +1 -1
  69. data/app/helpers/katello/katello_urls_helper.rb +26 -1
  70. data/app/helpers/katello/subscription_mailer_helper.rb +1 -1
  71. data/app/jobs/create_manifest_expire_soon_warning_notifications.rb +11 -0
  72. data/app/lib/actions/candlepin/owner/regenerate_upstream_identity_cert.rb +21 -0
  73. data/app/lib/actions/katello/capsule_content/sync.rb +1 -1
  74. data/app/lib/actions/katello/capsule_content/verify_checksum.rb +75 -0
  75. data/app/lib/actions/katello/content_view/promote.rb +1 -1
  76. data/app/lib/actions/katello/content_view/publish.rb +1 -1
  77. data/app/lib/actions/katello/content_view_version/verify_checksum.rb +29 -0
  78. data/app/lib/actions/katello/host/hypervisors_update.rb +1 -0
  79. data/app/lib/actions/katello/host/update_content_view.rb +2 -2
  80. data/app/lib/actions/katello/organization/manifest_import.rb +5 -0
  81. data/app/lib/actions/katello/organization/manifest_refresh.rb +3 -0
  82. data/app/lib/actions/katello/repository/metadata_generate.rb +7 -1
  83. data/app/lib/actions/katello/repository/remove_content.rb +1 -0
  84. data/app/lib/actions/katello/repository/sync.rb +2 -1
  85. data/app/lib/actions/katello/repository/upload_files.rb +1 -0
  86. data/app/lib/actions/pulp3/capsule_content/verify_checksum.rb +27 -0
  87. data/app/lib/actions/pulp3/orchestration/content_view_version/export_repository.rb +7 -9
  88. data/app/lib/actions/pulp3/orchestration/content_view_version/syncable_export.rb +5 -4
  89. data/app/lib/katello/concerns/base_template_scope_extensions.rb +7 -2
  90. data/app/lib/katello/errors.rb +4 -0
  91. data/app/lib/katello/http_resource.rb +6 -1
  92. data/app/lib/katello/resources/candlepin/consumer.rb +1 -1
  93. data/app/lib/katello/resources/candlepin/upstream_consumer.rb +18 -6
  94. data/app/lib/katello/resources/candlepin/upstream_job.rb +1 -1
  95. data/app/lib/katello/resources/registry.rb +25 -0
  96. data/app/mailers/katello/subscription_mailer.rb +3 -6
  97. data/app/models/katello/candlepin/repository_mapper.rb +1 -1
  98. data/app/models/katello/concerns/organization_extensions.rb +42 -3
  99. data/app/models/katello/content_view.rb +28 -0
  100. data/app/models/katello/content_view_environment_content_facet.rb +4 -2
  101. data/app/models/katello/glue/provider.rb +19 -12
  102. data/app/models/katello/glue/pulp/repos.rb +3 -8
  103. data/app/models/katello/host/content_facet.rb +1 -1
  104. data/app/models/katello/host/subscription_facet.rb +1 -1
  105. data/app/models/katello/host_collection.rb +12 -3
  106. data/app/models/katello/ping.rb +1 -1
  107. data/app/models/katello/repository.rb +33 -0
  108. data/app/models/katello/root_repository.rb +0 -4
  109. data/app/services/katello/content_unit_indexer.rb +9 -0
  110. data/app/services/katello/pulp3/alternate_content_source.rb +4 -6
  111. data/app/services/katello/pulp3/api/core.rb +13 -0
  112. data/app/services/katello/pulp3/api/yum.rb +11 -0
  113. data/app/services/katello/pulp3/docker_manifest.rb +5 -1
  114. data/app/services/katello/pulp3/repository/generic.rb +1 -1
  115. data/app/services/katello/pulp3/repository.rb +26 -6
  116. data/app/services/katello/pulp3/repository_mirror.rb +13 -12
  117. data/app/services/katello/pulp3/service_common.rb +2 -10
  118. data/app/services/katello/pulp3/smart_proxy_repository.rb +0 -2
  119. data/app/services/katello/ui_notifications/subscriptions/manifest_expire_soon_warning.rb +75 -0
  120. data/app/views/foreman/job_templates/update_package_-_katello_ansible_default.erb +5 -1
  121. data/app/views/foreman/job_templates/update_packages_by_search_query_-_katello_ansible_default.erb +2 -2
  122. data/app/views/foreman/job_templates/upload_profile.erb +16 -0
  123. data/app/views/katello/api/v2/content_view_filter_rules/show.json.rabl +9 -0
  124. data/app/views/katello/api/v2/docker_manifests/show.json.rabl +1 -0
  125. data/app/views/katello/api/v2/hosts/host_collections.json.rabl +5 -1
  126. data/app/views/katello/api/v2/organizations/show.json.rabl +9 -1
  127. data/app/views/katello/hosts/_errata_counts.html.erb +1 -1
  128. data/app/views/overrides/activation_keys/_host_environment_select.html.erb +1 -1
  129. data/app/views/overrides/activation_keys/_host_media_type_select.html.erb +15 -5
  130. data/app/views/overrides/activation_keys/_host_tab_pane.html.erb +1 -29
  131. data/config/routes/api/registry.rb +4 -8
  132. data/config/routes/api/v2.rb +2 -0
  133. data/db/migrate/20240423112842_add_fields_to_katello_docker_manifest.rb +8 -0
  134. data/db/migrate/20240502192021_change_katello_repository_rpms_id_seq_to_big_int.rb +9 -0
  135. data/db/seeds.d/109-katello-notification-blueprints.rb +6 -0
  136. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/activation-keys/details/activation-key-repository-sets.controller.js +3 -3
  137. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/new/views/new-content-credential.html +2 -1
  138. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/details/content-host-repository-sets.controller.js +3 -3
  139. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/bastion_katello.pot +0 -15
  140. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-info.html +8 -6
  141. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/views/new-repository.html +12 -10
  142. data/lib/katello/permission_creator.rb +3 -3
  143. data/lib/katello/permissions/registry_permissions.rb +4 -7
  144. data/lib/katello/plugin.rb +10 -9
  145. data/lib/katello/repository_types/ostree.rb +7 -0
  146. data/lib/katello/scheduled_jobs.rb +7 -1
  147. data/lib/katello/tasks/clean_backend_objects.rake +1 -1
  148. data/lib/katello/tasks/repository.rake +22 -0
  149. data/lib/katello/version.rb +1 -1
  150. data/locale/action_names.rb +4 -3
  151. data/locale/bn/katello.po +166 -151
  152. data/locale/bn_IN/katello.po +166 -151
  153. data/locale/ca/katello.po +166 -151
  154. data/locale/cs/katello.po +166 -151
  155. data/locale/cs_CZ/LC_MESSAGES/katello.mo +0 -0
  156. data/locale/cs_CZ/katello.po +172 -157
  157. data/locale/de/LC_MESSAGES/katello.mo +0 -0
  158. data/locale/de/katello.po +178 -163
  159. data/locale/de_AT/katello.po +166 -151
  160. data/locale/de_DE/katello.po +166 -151
  161. data/locale/el/katello.po +166 -151
  162. data/locale/en/katello.po +166 -151
  163. data/locale/en_GB/katello.po +166 -151
  164. data/locale/en_US/katello.po +166 -151
  165. data/locale/es/LC_MESSAGES/katello.mo +0 -0
  166. data/locale/es/katello.po +178 -163
  167. data/locale/et_EE/katello.po +166 -151
  168. data/locale/fr/LC_MESSAGES/katello.mo +0 -0
  169. data/locale/fr/katello.po +179 -164
  170. data/locale/gl/katello.po +166 -151
  171. data/locale/gu/katello.po +166 -151
  172. data/locale/he_IL/katello.po +166 -151
  173. data/locale/hi/katello.po +166 -151
  174. data/locale/id/katello.po +166 -151
  175. data/locale/it/LC_MESSAGES/katello.mo +0 -0
  176. data/locale/it/katello.po +169 -154
  177. data/locale/ja/LC_MESSAGES/katello.mo +0 -0
  178. data/locale/ja/katello.po +179 -164
  179. data/locale/ka/LC_MESSAGES/katello.mo +0 -0
  180. data/locale/ka/katello.po +177 -162
  181. data/locale/katello.pot +1119 -1062
  182. data/locale/kn/katello.po +166 -151
  183. data/locale/ko/LC_MESSAGES/katello.mo +0 -0
  184. data/locale/ko/katello.po +174 -159
  185. data/locale/ml_IN/katello.po +166 -151
  186. data/locale/mr/katello.po +166 -151
  187. data/locale/nl_NL/katello.po +166 -151
  188. data/locale/or/katello.po +166 -151
  189. data/locale/pa/katello.po +166 -151
  190. data/locale/pl/katello.po +166 -151
  191. data/locale/pl_PL/katello.po +166 -151
  192. data/locale/pt/katello.po +166 -151
  193. data/locale/pt_BR/LC_MESSAGES/katello.mo +0 -0
  194. data/locale/pt_BR/katello.po +178 -163
  195. data/locale/ro/katello.po +166 -151
  196. data/locale/ro_RO/katello.po +166 -151
  197. data/locale/ru/LC_MESSAGES/katello.mo +0 -0
  198. data/locale/ru/katello.po +171 -156
  199. data/locale/sl/katello.po +166 -151
  200. data/locale/sv_SE/katello.po +166 -151
  201. data/locale/ta/katello.po +166 -151
  202. data/locale/ta_IN/katello.po +166 -151
  203. data/locale/te/katello.po +166 -151
  204. data/locale/tr/katello.po +166 -151
  205. data/locale/vi/katello.po +166 -151
  206. data/locale/vi_VN/katello.po +166 -151
  207. data/locale/zh/katello.po +166 -151
  208. data/locale/zh_CN/LC_MESSAGES/katello.mo +0 -0
  209. data/locale/zh_CN/katello.po +179 -164
  210. data/locale/zh_TW/LC_MESSAGES/katello.mo +0 -0
  211. data/locale/zh_TW/katello.po +171 -156
  212. data/webpack/ForemanColumnExtensions/index.js +129 -0
  213. data/webpack/components/ActivationKeysSearch/ActivationKeysSearch.test.js +28 -0
  214. data/webpack/components/ActivationKeysSearch/index.js +222 -0
  215. data/webpack/components/Table/TableWrapper.js +14 -0
  216. data/webpack/components/extensions/HostDetails/ActionsBar/index.js +1 -1
  217. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab/PackagesTab.js +1 -1
  218. data/webpack/components/extensions/HostDetails/Tabs/__tests__/packageInstallModal.test.js +1 -0
  219. data/webpack/components/extensions/HostDetails/Tabs/__tests__/packagesTab.test.js +1 -0
  220. data/webpack/components/extensions/Hosts/ActionsBar/index.js +20 -1
  221. data/webpack/components/extensions/Hosts/BulkActions/BulkChangeHostCVModal/BulkChangeHostCVModal.js +220 -0
  222. data/webpack/components/extensions/Hosts/BulkActions/BulkChangeHostCVModal/actions.js +23 -0
  223. data/webpack/components/extensions/Hosts/BulkActions/BulkChangeHostCVModal/index.js +25 -0
  224. data/webpack/components/extensions/Hosts/BulkActions/__tests__/bulkChangeHostCVModal.test.js +133 -0
  225. data/webpack/global_index.js +19 -0
  226. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ContentViewComponents.js +6 -3
  227. data/webpack/scenes/Hosts/ChangeContentSource/actions.js +3 -1
  228. data/webpack/scenes/Hosts/ChangeContentSource/components/ContentSourceForm.js +63 -25
  229. data/webpack/scenes/Hosts/ChangeContentSource/index.js +24 -16
  230. data/webpack/scenes/RedHatRepositories/__tests__/__snapshots__/RedHatRepositoriesPage.test.js.snap +1 -0
  231. data/webpack/scenes/Subscriptions/Manifest/ManageManifestModal.js +64 -5
  232. data/webpack/scenes/Subscriptions/UpstreamSubscriptions/UpstreamSubscriptionsPage.js +16 -13
  233. data/webpack/scenes/Subscriptions/UpstreamSubscriptions/__tests__/__snapshots__/UpstreamSubscriptionsPage.test.js.snap +14 -8
  234. data/webpack/scenes/Subscriptions/__tests__/__snapshots__/SubscriptionsPage.test.js.snap +1 -0
  235. data/webpack/scenes/Subscriptions/components/SubscriptionsToolbar/SubscriptionsToolbar.js +1 -1
  236. metadata +61 -42
  237. data/app/assets/javascripts/katello/hosts/activation_key_edit.js +0 -167
  238. data/app/lib/actions/katello/host/upload_package_profile.rb +0 -45
  239. data/app/lib/actions/katello/host/upload_profiles.rb +0 -47
@@ -17,7 +17,6 @@ import { selectApiDataStatus,
17
17
  selectContentHosts,
18
18
  selectContentHostsWithoutContent,
19
19
  selectContentSources,
20
- selectJobInvocationPath,
21
20
  selectContentViews,
22
21
  selectTemplate } from './selectors';
23
22
 
@@ -46,31 +45,36 @@ const ChangeContentSourcePage = () => {
46
45
  const contentHosts = useSelector(selectContentHosts);
47
46
  const hostsWithoutContent = useSelector(selectContentHostsWithoutContent);
48
47
  const contentSources = useSelector(selectContentSources);
49
- const jobInvocationPath = useSelector(selectJobInvocationPath);
50
48
 
51
49
  const template = useSelector(selectTemplate);
52
50
  const contentViews = useSelector(selectContentViews);
53
-
54
- const [contentSourceId, setCapsuleId] = useState('');
51
+ const { initialContentSourceId } = urlParams;
52
+ const [contentSourceId, setCapsuleId] = useState(initialContentSourceId ?? '');
53
+ // if this matches, we'll trust you that initialContentSourceId is the host's content source
54
+ const showCVOnlyAlert = (contentHosts.length === 1 &&
55
+ hostsWithoutContent.length === 0 &&
56
+ !!initialContentSourceId &&
57
+ initialContentSourceId === contentSourceId
58
+ );
59
+ const hostDetailsPath = showCVOnlyAlert ? `new/hosts/${contentHosts[0].name}` : '';
60
+ const hostEditPath = urlParams.fromPage === 'hostEdit' ? foremanUrl(`/hosts/${contentHosts[0]?.name}/edit`) : '';
55
61
  const [selectedEnvironment, setSelectedEnvironment] = useState([]);
56
62
  const [contentViewName, setContentViewName] = useState('');
57
63
  const [shouldShowTemplate, setShouldShowTemplate] = useState(false);
58
- const [redirect, setRedirect] = useState(false);
64
+ const [redirect, setRedirect] = useState('');
59
65
 
60
66
  const contentViewId = contentViews?.find(cv => cv.name === contentViewName)?.id;
61
67
  const hostIds = useMemo(() => getHostIds(urlParams.host_id), [urlParams.host_id]);
62
68
  const noHostSpecified = (hostIds.length === 0 && urlParams.searchParam === '');
63
69
  const environmentId = selectedEnvironment[0]?.id;
64
70
 
65
- const redirectToJobInvocationForm = () => setRedirect(true);
66
-
67
- const handleSuccess = ({ shouldRedirect }) => {
68
- if (shouldRedirect) {
69
- redirectToJobInvocationForm();
71
+ const handleSuccess = ({ redirectTo = '' }) => {
72
+ if (redirectTo) {
73
+ setRedirect(redirectTo);
70
74
  }
71
75
  };
72
76
 
73
- const handleSubmit = (e, { shouldRedirect = false }) => {
77
+ const handleSubmit = (e, { redirectTo = '', showSuccessToast = false } = {}) => {
74
78
  e.preventDefault();
75
79
 
76
80
  dispatch(changeContentSource(
@@ -78,7 +82,8 @@ const ChangeContentSourcePage = () => {
78
82
  contentViewId,
79
83
  contentSourceId,
80
84
  contentHosts.map(h => h.id),
81
- () => handleSuccess({ shouldRedirect }),
85
+ () => handleSuccess({ redirectTo }),
86
+ showSuccessToast ? () => __('Host content view environment(s) updated') : undefined,
82
87
  ));
83
88
  };
84
89
 
@@ -93,7 +98,7 @@ const ChangeContentSourcePage = () => {
93
98
  };
94
99
 
95
100
  const showTemplate = (e) => {
96
- handleSubmit(e, { shouldRedirect: false });
101
+ handleSubmit(e);
97
102
  setShouldShowTemplate(true);
98
103
  };
99
104
 
@@ -122,8 +127,8 @@ const ChangeContentSourcePage = () => {
122
127
  dispatch(getFormData(hostIds, urlParams.searchParam));
123
128
  }, [dispatch, hostIds, urlParams.searchParam]);
124
129
 
125
- if (redirect && jobInvocationPath) {
126
- window.location.assign(jobInvocationPath); // redirect to job invocation wizard
130
+ if (redirect && redirect !== '') {
131
+ window.location.assign(redirect);
127
132
  }
128
133
 
129
134
  return (
@@ -165,7 +170,7 @@ const ChangeContentSourcePage = () => {
165
170
  title={__('No hosts were specified')}
166
171
  />
167
172
  </GridItem>
168
- }
173
+ }
169
174
  { !noHostSpecified &&
170
175
  <>
171
176
  <Hosts
@@ -182,6 +187,9 @@ const ChangeContentSourcePage = () => {
182
187
  contentViewName={contentViewName}
183
188
  contentSources={contentSources}
184
189
  contentSourceId={contentSourceId}
190
+ showCVOnlyAlert={showCVOnlyAlert}
191
+ hostDetailsPath={hostDetailsPath}
192
+ hostEditPath={hostEditPath}
185
193
  handleContentSource={handleContentSource}
186
194
  contentHosts={contentHosts}
187
195
  isLoading={isLoading}
@@ -7,6 +7,7 @@ exports[`RedHatRepositories page should render <PermissionDenied /> when permiss
7
7
  "view_organizations",
8
8
  ]
9
9
  }
10
+ primaryButton={null}
10
11
  />
11
12
  `;
12
13
 
@@ -1,7 +1,10 @@
1
1
  import React, { Component } from 'react';
2
2
  import PropTypes from 'prop-types';
3
3
  import { Grid, Col, Row, Tabs, Tab, FormControl, ControlLabel } from 'react-bootstrap';
4
+ import { FormattedMessage } from 'react-intl';
4
5
  import { Button, Spinner } from 'patternfly-react';
6
+ import { Alert } from '@patternfly/react-core';
7
+ import { propsToCamelCase } from 'foremanReact/common/helpers';
5
8
  import ForemanModal from 'foremanReact/components/ForemanModal';
6
9
  import Slot from 'foremanReact/components/common/Slot';
7
10
  import { translate as __ } from 'foremanReact/common/I18n';
@@ -92,22 +95,29 @@ class ManageManifestModal extends Component {
92
95
  contentCredentials,
93
96
  } = this.props;
94
97
 
98
+ const {
99
+ manifestExpiringSoon,
100
+ manifestExpired,
101
+ manifestExpirationDate,
102
+ manifestExpireDaysRemaining,
103
+ } = propsToCamelCase(organization);
104
+
95
105
  const actionInProgress = (taskInProgress || manifestActionStarted);
96
106
  const showCdnConfigurationTab = canEditOrganizations;
97
107
  const showSubscriptionManifest = (canImportManifest || canDeleteManifest);
98
108
  const showManifestTab = (canEditOrganizations || showSubscriptionManifest);
99
109
 
100
110
  const emptyStateData = () => ({
101
- header: __('There is no Manifest History to display.'),
102
- description: __('Import a Manifest using the manifest tab above.'),
111
+ header: __('There is no manifest history to display.'),
112
+ description: __('Import a manifest using the Manifest tab above.'),
103
113
  documentation: {
104
- label: __('Learn more about adding Subscription Manifests '),
114
+ label: __('Learn more about adding subscription manifests '),
105
115
  url: 'https://access.redhat.com/solutions/3410771',
106
116
  },
107
117
  });
108
118
 
109
119
  const getManifestName = () => {
110
- let name = __('No Manifest Uploaded');
120
+ let name = __('No manifest imported');
111
121
 
112
122
  if (
113
123
  organization.owner_details &&
@@ -139,6 +149,46 @@ class ManageManifestModal extends Component {
139
149
  <React.Fragment>
140
150
  <Grid>
141
151
  <h3>{__('Subscription Manifest')}</h3>
152
+ {manifestExpiringSoon &&
153
+ <Alert
154
+ ouiaId="manifest-expiring-soon-alert"
155
+ variant="warning"
156
+ title={__('Manifest expiring soon')}
157
+ >
158
+ <FormattedMessage
159
+ defaultMessage={__('Your manifest will expire in {daysMessage}. To extend the expiration date, refresh your manifest. Or, if your Foreman is disconnected, import a new manifest.')}
160
+ values={{
161
+ daysMessage: (
162
+ <FormattedMessage
163
+ defaultMessage="{daysRemaining, plural, one {{singular}} other {# {plural}}}"
164
+ values={{
165
+ daysRemaining: manifestExpireDaysRemaining,
166
+ singular: __('day'),
167
+ plural: __('days'),
168
+ }}
169
+ id="manage-manifest-expire-days-i18n"
170
+ />
171
+ ),
172
+ }}
173
+ id="manage-manifest-expire-i18n"
174
+ />
175
+ </Alert>
176
+ }
177
+ {manifestExpired && isManifestImported &&
178
+ <Alert
179
+ ouiaId="manifest-expired-alert"
180
+ variant="danger"
181
+ title={__('Manifest expired')}
182
+ >
183
+ <FormattedMessage
184
+ defaultMessage={__('Your manifest expired on {expirationDate}. To continue using Red Hat content, import a new manifest.')}
185
+ values={{
186
+ expirationDate: new Date(manifestExpirationDate).toDateString(),
187
+ }}
188
+ id="manage-manifest-expired-i18n"
189
+ />
190
+ </Alert>
191
+ }
142
192
  <hr />
143
193
  <Row>
144
194
  <Col sm={5}>
@@ -148,13 +198,22 @@ class ManageManifestModal extends Component {
148
198
  {getManifestName()}
149
199
  </Col>
150
200
  </Row>
201
+ {isManifestImported && manifestExpirationDate &&
202
+ <Row>
203
+ <Col sm={5} />
204
+ <Col sm={7}>
205
+ {manifestExpired ? __('Expired ') : __('Expires ')}
206
+ {new Date(manifestExpirationDate).toDateString()}
207
+ </Col>
208
+ </Row>
209
+ }
151
210
  <Row>
152
211
  <Col sm={5}>
153
212
  {canImportManifest &&
154
213
  <ControlLabel
155
214
  style={{ paddingTop: '10px' }}
156
215
  >
157
- <div>{__('Import New Manifest')}</div>
216
+ <div>{__('Import new manifest')}</div>
158
217
  </ControlLabel>
159
218
  }
160
219
  </Col>
@@ -222,19 +222,22 @@ class UpstreamSubscriptionsPage extends Component {
222
222
 
223
223
  return (
224
224
  <Grid bsClass="container-fluid">
225
- <BreadcrumbsBar data={{
226
- isSwitchable: false,
227
- breadcrumbItems: [
228
- {
229
- caption: __('Subscriptions'),
230
- onClick: () => this.props.history.push('/subscriptions'),
231
- },
232
- {
233
- caption: __('Add Subscriptions'),
234
- },
235
- ],
236
- }}
237
- />
225
+ {!upstreamSubscriptions.loading &&
226
+ <div style={{ marginBottom: '10px' }}>
227
+ <BreadcrumbsBar
228
+ isLoadingResources={upstreamSubscriptions.loading}
229
+ breadcrumbItems={[
230
+ {
231
+ caption: __('Subscriptions'),
232
+ url: '/subscriptions/',
233
+ },
234
+ {
235
+ caption: String(__('Add Subscriptions')),
236
+ },
237
+ ]}
238
+ />
239
+ </div>
240
+ }
238
241
 
239
242
  <LoadingState loading={upstreamSubscriptions.loading} loadingText={__('Loading')}>
240
243
  <Row>
@@ -6,22 +6,28 @@ exports[`upstream subscriptions page should render 1`] = `
6
6
  componentClass="div"
7
7
  fluid={false}
8
8
  >
9
- <BreadcrumbsBar
10
- data={
9
+ <div
10
+ style={
11
11
  Object {
12
- "breadcrumbItems": Array [
12
+ "marginBottom": "10px",
13
+ }
14
+ }
15
+ >
16
+ <BreadcrumbsBar
17
+ breadcrumbItems={
18
+ Array [
13
19
  Object {
14
20
  "caption": "Subscriptions",
15
- "onClick": [Function],
21
+ "url": "/subscriptions/",
16
22
  },
17
23
  Object {
18
24
  "caption": "Add Subscriptions",
19
25
  },
20
- ],
21
- "isSwitchable": false,
26
+ ]
22
27
  }
23
- }
24
- />
28
+ isLoadingResources={false}
29
+ />
30
+ </div>
25
31
  <LoadingState
26
32
  loading={false}
27
33
  loadingText="Loading"
@@ -7,6 +7,7 @@ exports[`subscriptions page should render <PermissionDenied /> when permissions
7
7
  "view_subscriptions",
8
8
  ]
9
9
  }
10
+ primaryButton={null}
10
11
  />
11
12
  `;
12
13
 
@@ -49,7 +49,7 @@ const SubscriptionsToolbar = ({
49
49
  <FormGroup>
50
50
  {canManageSubscriptionAllocations &&
51
51
  <LinkContainer
52
- to="subscriptions/add"
52
+ to="/subscriptions/add"
53
53
  disabled={disableManifestActions || disableAddButton}
54
54
  >
55
55
  <TooltipButton
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.12.0
4
+ version: 4.13.0.rc1
5
5
  platform: ruby
6
6
  authors:
7
7
  - N/A
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-03-19 00:00:00.000000000 Z
11
+ date: 2024-05-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -254,174 +254,180 @@ dependencies:
254
254
  requirements:
255
255
  - - ">="
256
256
  - !ruby/object:Gem::Version
257
- version: 3.39.0
257
+ version: 3.49.1
258
258
  - - "<"
259
259
  - !ruby/object:Gem::Version
260
- version: 3.40.0
260
+ version: 3.50.0
261
261
  type: :runtime
262
262
  prerelease: false
263
263
  version_requirements: !ruby/object:Gem::Requirement
264
264
  requirements:
265
265
  - - ">="
266
266
  - !ruby/object:Gem::Version
267
- version: 3.39.0
267
+ version: 3.49.1
268
268
  - - "<"
269
269
  - !ruby/object:Gem::Version
270
- version: 3.40.0
270
+ version: 3.50.0
271
271
  - !ruby/object:Gem::Dependency
272
272
  name: pulp_file_client
273
273
  requirement: !ruby/object:Gem::Requirement
274
274
  requirements:
275
275
  - - ">="
276
276
  - !ruby/object:Gem::Version
277
- version: 1.15.0
277
+ version: 3.49.1
278
278
  - - "<"
279
279
  - !ruby/object:Gem::Version
280
- version: 1.16.0
280
+ version: 3.50.0
281
281
  type: :runtime
282
282
  prerelease: false
283
283
  version_requirements: !ruby/object:Gem::Requirement
284
284
  requirements:
285
285
  - - ">="
286
286
  - !ruby/object:Gem::Version
287
- version: 1.15.0
287
+ version: 3.49.1
288
288
  - - "<"
289
289
  - !ruby/object:Gem::Version
290
- version: 1.16.0
290
+ version: 3.50.0
291
291
  - !ruby/object:Gem::Dependency
292
292
  name: pulp_ansible_client
293
293
  requirement: !ruby/object:Gem::Requirement
294
294
  requirements:
295
295
  - - ">="
296
296
  - !ruby/object:Gem::Version
297
- version: 0.20.0
297
+ version: 0.21.3
298
298
  - - "<"
299
299
  - !ruby/object:Gem::Version
300
- version: 0.21.0
300
+ version: 0.22.0
301
301
  type: :runtime
302
302
  prerelease: false
303
303
  version_requirements: !ruby/object:Gem::Requirement
304
304
  requirements:
305
305
  - - ">="
306
306
  - !ruby/object:Gem::Version
307
- version: 0.20.0
307
+ version: 0.21.3
308
308
  - - "<"
309
309
  - !ruby/object:Gem::Version
310
- version: 0.21.0
310
+ version: 0.22.0
311
311
  - !ruby/object:Gem::Dependency
312
312
  name: pulp_container_client
313
313
  requirement: !ruby/object:Gem::Requirement
314
314
  requirements:
315
315
  - - ">="
316
316
  - !ruby/object:Gem::Version
317
- version: 2.16.0
317
+ version: 2.20.0
318
318
  - - "<"
319
319
  - !ruby/object:Gem::Version
320
- version: 2.17.0
320
+ version: 2.21.0
321
321
  type: :runtime
322
322
  prerelease: false
323
323
  version_requirements: !ruby/object:Gem::Requirement
324
324
  requirements:
325
325
  - - ">="
326
326
  - !ruby/object:Gem::Version
327
- version: 2.16.0
327
+ version: 2.20.0
328
328
  - - "<"
329
329
  - !ruby/object:Gem::Version
330
- version: 2.17.0
330
+ version: 2.21.0
331
331
  - !ruby/object:Gem::Dependency
332
332
  name: pulp_deb_client
333
333
  requirement: !ruby/object:Gem::Requirement
334
334
  requirements:
335
335
  - - ">="
336
336
  - !ruby/object:Gem::Version
337
- version: 3.0.0
337
+ version: 3.2.0
338
338
  - - "<"
339
339
  - !ruby/object:Gem::Version
340
- version: 3.1.0
340
+ version: 3.3.0
341
341
  type: :runtime
342
342
  prerelease: false
343
343
  version_requirements: !ruby/object:Gem::Requirement
344
344
  requirements:
345
345
  - - ">="
346
346
  - !ruby/object:Gem::Version
347
- version: 3.0.0
347
+ version: 3.2.0
348
348
  - - "<"
349
349
  - !ruby/object:Gem::Version
350
- version: 3.1.0
350
+ version: 3.3.0
351
351
  - !ruby/object:Gem::Dependency
352
352
  name: pulp_rpm_client
353
353
  requirement: !ruby/object:Gem::Requirement
354
354
  requirements:
355
355
  - - ">="
356
356
  - !ruby/object:Gem::Version
357
- version: 3.23.0
357
+ version: 3.25.2
358
358
  - - "<"
359
359
  - !ruby/object:Gem::Version
360
- version: 3.24.0
360
+ version: 3.26.0
361
361
  type: :runtime
362
362
  prerelease: false
363
363
  version_requirements: !ruby/object:Gem::Requirement
364
364
  requirements:
365
365
  - - ">="
366
366
  - !ruby/object:Gem::Version
367
- version: 3.23.0
367
+ version: 3.25.2
368
368
  - - "<"
369
369
  - !ruby/object:Gem::Version
370
- version: 3.24.0
370
+ version: 3.26.0
371
371
  - !ruby/object:Gem::Dependency
372
372
  name: pulp_certguard_client
373
373
  requirement: !ruby/object:Gem::Requirement
374
374
  requirements:
375
+ - - ">="
376
+ - !ruby/object:Gem::Version
377
+ version: 3.49.1
375
378
  - - "<"
376
379
  - !ruby/object:Gem::Version
377
- version: 2.0.0
380
+ version: 3.50.0
378
381
  type: :runtime
379
382
  prerelease: false
380
383
  version_requirements: !ruby/object:Gem::Requirement
381
384
  requirements:
385
+ - - ">="
386
+ - !ruby/object:Gem::Version
387
+ version: 3.49.1
382
388
  - - "<"
383
389
  - !ruby/object:Gem::Version
384
- version: 2.0.0
390
+ version: 3.50.0
385
391
  - !ruby/object:Gem::Dependency
386
392
  name: pulp_python_client
387
393
  requirement: !ruby/object:Gem::Requirement
388
394
  requirements:
389
395
  - - ">="
390
396
  - !ruby/object:Gem::Version
391
- version: 3.10.0
397
+ version: 3.11.0
392
398
  - - "<"
393
399
  - !ruby/object:Gem::Version
394
- version: 3.11.0
400
+ version: 3.12.0
395
401
  type: :runtime
396
402
  prerelease: false
397
403
  version_requirements: !ruby/object:Gem::Requirement
398
404
  requirements:
399
405
  - - ">="
400
406
  - !ruby/object:Gem::Version
401
- version: 3.10.0
407
+ version: 3.11.0
402
408
  - - "<"
403
409
  - !ruby/object:Gem::Version
404
- version: 3.11.0
410
+ version: 3.12.0
405
411
  - !ruby/object:Gem::Dependency
406
412
  name: pulp_ostree_client
407
413
  requirement: !ruby/object:Gem::Requirement
408
414
  requirements:
409
415
  - - ">="
410
416
  - !ruby/object:Gem::Version
411
- version: 2.1.0
417
+ version: 2.3.0
412
418
  - - "<"
413
419
  - !ruby/object:Gem::Version
414
- version: 2.2.0
420
+ version: 2.4.0
415
421
  type: :runtime
416
422
  prerelease: false
417
423
  version_requirements: !ruby/object:Gem::Requirement
418
424
  requirements:
419
425
  - - ">="
420
426
  - !ruby/object:Gem::Version
421
- version: 2.1.0
427
+ version: 2.3.0
422
428
  - - "<"
423
429
  - !ruby/object:Gem::Version
424
- version: 2.2.0
430
+ version: 2.4.0
425
431
  - !ruby/object:Gem::Dependency
426
432
  name: deface
427
433
  requirement: !ruby/object:Gem::Requirement
@@ -535,7 +541,6 @@ files:
535
541
  - app/assets/javascripts/katello/common/spin.min.js
536
542
  - app/assets/javascripts/katello/common/vendor.js
537
543
  - app/assets/javascripts/katello/containers/container.js
538
- - app/assets/javascripts/katello/hosts/activation_key_edit.js
539
544
  - app/assets/javascripts/katello/hosts/host_and_hostgroup_edit.js
540
545
  - app/assets/javascripts/katello/html5/excanvas.js
541
546
  - app/assets/javascripts/katello/html5/html5.js
@@ -713,6 +718,7 @@ files:
713
718
  - app/helpers/katello/translation_helper.rb
714
719
  - app/jobs/create_expired_manifest_notifications.rb
715
720
  - app/jobs/create_host_lifecycle_expire_soon_notifications.rb
721
+ - app/jobs/create_manifest_expire_soon_warning_notifications.rb
716
722
  - app/jobs/create_pulp_disk_space_notifications.rb
717
723
  - app/jobs/send_expire_soon_notifications.rb
718
724
  - app/lib/actions/abstract_async_task.rb
@@ -734,6 +740,7 @@ files:
734
740
  - app/lib/actions/candlepin/owner/destroy_imports.rb
735
741
  - app/lib/actions/candlepin/owner/import.rb
736
742
  - app/lib/actions/candlepin/owner/import_products.rb
743
+ - app/lib/actions/candlepin/owner/regenerate_upstream_identity_cert.rb
737
744
  - app/lib/actions/candlepin/owner/retrieve_upstream_export.rb
738
745
  - app/lib/actions/candlepin/owner/start_upstream_export.rb
739
746
  - app/lib/actions/candlepin/owner/upstream_update.rb
@@ -769,6 +776,7 @@ files:
769
776
  - app/lib/actions/katello/capsule_content/sync.rb
770
777
  - app/lib/actions/katello/capsule_content/sync_capsule.rb
771
778
  - app/lib/actions/katello/capsule_content/update_content_counts.rb
779
+ - app/lib/actions/katello/capsule_content/verify_checksum.rb
772
780
  - app/lib/actions/katello/cdn_configuration/update.rb
773
781
  - app/lib/actions/katello/check_matching_content.rb
774
782
  - app/lib/actions/katello/content_credential/update.rb
@@ -802,6 +810,7 @@ files:
802
810
  - app/lib/actions/katello/content_view_version/incremental_update.rb
803
811
  - app/lib/actions/katello/content_view_version/republish_repositories.rb
804
812
  - app/lib/actions/katello/content_view_version/reset_content_view_repositories_from_metadata.rb
813
+ - app/lib/actions/katello/content_view_version/verify_checksum.rb
805
814
  - app/lib/actions/katello/environment/destroy.rb
806
815
  - app/lib/actions/katello/environment/publish_repositories.rb
807
816
  - app/lib/actions/katello/foreman/abstract.rb
@@ -818,8 +827,6 @@ files:
818
827
  - app/lib/actions/katello/host/update_content_view.rb
819
828
  - app/lib/actions/katello/host/update_release_version.rb
820
829
  - app/lib/actions/katello/host/update_system_purpose.rb
821
- - app/lib/actions/katello/host/upload_package_profile.rb
822
- - app/lib/actions/katello/host/upload_profiles.rb
823
830
  - app/lib/actions/katello/jail_concern/content_view.rb
824
831
  - app/lib/actions/katello/jail_concern/organization.rb
825
832
  - app/lib/actions/katello/organization/destroy.rb
@@ -914,6 +921,7 @@ files:
914
921
  - app/lib/actions/pulp3/capsule_content/reclaim_space.rb
915
922
  - app/lib/actions/pulp3/capsule_content/refresh_distribution.rb
916
923
  - app/lib/actions/pulp3/capsule_content/sync.rb
924
+ - app/lib/actions/pulp3/capsule_content/verify_checksum.rb
917
925
  - app/lib/actions/pulp3/content_guard/refresh.rb
918
926
  - app/lib/actions/pulp3/content_guard/refresh_all_distributions.rb
919
927
  - app/lib/actions/pulp3/content_view/delete_repository_references.rb
@@ -1386,6 +1394,7 @@ files:
1386
1394
  - app/services/katello/ui_notifications/subscriptions/expire_soon.rb
1387
1395
  - app/services/katello/ui_notifications/subscriptions/manifest_delete_error.rb
1388
1396
  - app/services/katello/ui_notifications/subscriptions/manifest_delete_success.rb
1397
+ - app/services/katello/ui_notifications/subscriptions/manifest_expire_soon_warning.rb
1389
1398
  - app/services/katello/ui_notifications/subscriptions/manifest_expired_warning.rb
1390
1399
  - app/services/katello/ui_notifications/subscriptions/manifest_import_error.rb
1391
1400
  - app/services/katello/ui_notifications/subscriptions/manifest_import_success.rb
@@ -1430,6 +1439,7 @@ files:
1430
1439
  - app/views/foreman/job_templates/update_package_-_katello_ansible_default.erb
1431
1440
  - app/views/foreman/job_templates/update_packages_by_search_query.erb
1432
1441
  - app/views/foreman/job_templates/update_packages_by_search_query_-_katello_ansible_default.erb
1442
+ - app/views/foreman/job_templates/upload_profile.erb
1433
1443
  - app/views/foreman/smart_proxies/_content_sync.html.erb
1434
1444
  - app/views/foreman/smart_proxies/_content_tab.html.erb
1435
1445
  - app/views/foreman/smart_proxies/_reclaim_space.html.erb
@@ -2046,6 +2056,8 @@ files:
2046
2056
  - db/migrate/20240122150431_remove_content_counts_index.rb
2047
2057
  - db/migrate/20240123120109_remove_pulp_export_destination_setting.rb
2048
2058
  - db/migrate/20240207191223_remove_entitlement_mode_host_statuses.rb
2059
+ - db/migrate/20240423112842_add_fields_to_katello_docker_manifest.rb
2060
+ - db/migrate/20240502192021_change_katello_repository_rpms_id_seq_to_big_int.rb
2049
2061
  - db/seeds.d/101-locations.rb
2050
2062
  - db/seeds.d/102-organizations.rb
2051
2063
  - db/seeds.d/104-proxy.rb
@@ -4503,6 +4515,7 @@ files:
4503
4515
  - vendor/assets/stylesheets/katello/jquery.multiselect.css
4504
4516
  - vendor/assets/stylesheets/katello/jquery.multiselect.filter.css
4505
4517
  - vendor/assets/stylesheets/katello/jquery.treeTable.css.scss
4518
+ - webpack/ForemanColumnExtensions/index.js
4506
4519
  - webpack/__mocks__/foremanJS/foreman_toast_notifications.js
4507
4520
  - webpack/__mocks__/foremanReact/Root/Context/ForemanContext.js
4508
4521
  - webpack/__mocks__/foremanReact/common/urlHelpers.js
@@ -4515,6 +4528,8 @@ files:
4515
4528
  - webpack/__mocks__/react-intl/locale-data/en.js
4516
4529
  - webpack/common_index.js
4517
4530
  - webpack/components/ActionableDetail.js
4531
+ - webpack/components/ActivationKeysSearch/ActivationKeysSearch.test.js
4532
+ - webpack/components/ActivationKeysSearch/index.js
4518
4533
  - webpack/components/AddedStatusLabel.js
4519
4534
  - webpack/components/Bookmark/AddBookmarkModal.js
4520
4535
  - webpack/components/Bookmark/Bookmark.scss
@@ -4705,6 +4720,10 @@ files:
4705
4720
  - webpack/components/extensions/HostDetails/Tabs/customizedRexUrlHelpers.js
4706
4721
  - webpack/components/extensions/HostDetails/hostDetailsHelpers.js
4707
4722
  - webpack/components/extensions/Hosts/ActionsBar/index.js
4723
+ - webpack/components/extensions/Hosts/BulkActions/BulkChangeHostCVModal/BulkChangeHostCVModal.js
4724
+ - webpack/components/extensions/Hosts/BulkActions/BulkChangeHostCVModal/actions.js
4725
+ - webpack/components/extensions/Hosts/BulkActions/BulkChangeHostCVModal/index.js
4726
+ - webpack/components/extensions/Hosts/BulkActions/__tests__/bulkChangeHostCVModal.test.js
4708
4727
  - webpack/components/extensions/Hosts/constants.js
4709
4728
  - webpack/components/extensions/RegistrationCommands/RegistrationCommandsPageConstants.js
4710
4729
  - webpack/components/extensions/RegistrationCommands/RegistrationCommandsPageHelpers.js
@@ -5398,11 +5417,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
5398
5417
  version: '4'
5399
5418
  required_rubygems_version: !ruby/object:Gem::Requirement
5400
5419
  requirements:
5401
- - - ">="
5420
+ - - ">"
5402
5421
  - !ruby/object:Gem::Version
5403
- version: '0'
5422
+ version: 1.3.1
5404
5423
  requirements: []
5405
- rubygems_version: 3.4.10
5424
+ rubygems_version: 3.4.19
5406
5425
  signing_key:
5407
5426
  specification_version: 4
5408
5427
  summary: Content and Subscription Management plugin for Foreman