katello 4.3.0 → 4.4.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 (337) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/katello/common/vendor.js +0 -1
  3. data/app/controllers/katello/api/v2/api_controller.rb +13 -4
  4. data/app/controllers/katello/api/v2/content_view_versions_controller.rb +3 -0
  5. data/app/controllers/katello/api/v2/content_views_controller.rb +46 -0
  6. data/app/controllers/katello/api/v2/host_packages_controller.rb +21 -1
  7. data/app/controllers/katello/api/v2/hosts_bulk_actions_controller.rb +30 -1
  8. data/app/controllers/katello/api/v2/organizations_controller.rb +10 -6
  9. data/app/controllers/katello/api/v2/packages_controller.rb +4 -0
  10. data/app/controllers/katello/api/v2/repositories_controller.rb +17 -7
  11. data/app/controllers/katello/api/v2/repository_sets_controller.rb +7 -0
  12. data/app/controllers/katello/concerns/api/v2/repository_content_controller.rb +3 -0
  13. data/app/controllers/katello/concerns/hosts_controller_extensions.rb +32 -0
  14. data/app/controllers/katello/remote_execution_controller.rb +5 -4
  15. data/app/helpers/katello/content_source_helper.rb +43 -0
  16. data/app/helpers/katello/hosts_and_hostgroups_helper.rb +4 -0
  17. data/app/lib/actions/katello/cdn_configuration/update.rb +5 -7
  18. data/app/lib/actions/katello/content_view/publish.rb +5 -0
  19. data/app/lib/actions/katello/content_view_version/incremental_update.rb +17 -3
  20. data/app/lib/actions/katello/repository/discover.rb +1 -14
  21. data/app/lib/actions/katello/repository/filtered_index_content.rb +1 -1
  22. data/app/lib/actions/pulp3/content_view_version/import.rb +7 -0
  23. data/app/lib/actions/pulp3/orchestration/content_view_version/import.rb +7 -5
  24. data/app/lib/actions/pulp3/repository/copy_content.rb +1 -1
  25. data/app/lib/actions/pulp3/repository/save_artifact.rb +1 -0
  26. data/app/lib/katello/concerns/base_template_scope_extensions.rb +11 -0
  27. data/app/lib/katello/errors.rb +3 -3
  28. data/app/lib/katello/logging.rb +6 -1
  29. data/app/lib/katello/repo_discovery.rb +27 -19
  30. data/app/lib/katello/resources/cdn/katello_cdn.rb +41 -3
  31. data/app/lib/katello/resources/cdn.rb +4 -2
  32. data/app/lib/katello/util/deduplication_migrator.rb +105 -0
  33. data/app/models/katello/candlepin/repository_mapper.rb +1 -1
  34. data/app/models/katello/cdn_configuration.rb +38 -6
  35. data/app/models/katello/concerns/host_managed_extensions.rb +23 -1
  36. data/app/models/katello/concerns/organization_extensions.rb +5 -1
  37. data/app/models/katello/concerns/pulp_database_unit.rb +59 -173
  38. data/app/models/katello/concerns/remote_execution_proxy_selector_extensions.rb +11 -0
  39. data/app/models/katello/concerns/smart_proxy_extensions.rb +1 -1
  40. data/app/models/katello/content_view.rb +4 -4
  41. data/app/models/katello/content_view_filter.rb +1 -1
  42. data/app/models/katello/content_view_history.rb +1 -1
  43. data/app/models/katello/content_view_version.rb +6 -2
  44. data/app/models/katello/content_view_version_export_history.rb +1 -1
  45. data/app/models/katello/deb.rb +1 -3
  46. data/app/models/katello/docker_meta_tag.rb +1 -1
  47. data/app/models/katello/erratum.rb +0 -15
  48. data/app/models/katello/glue/pulp/repos.rb +1 -1
  49. data/app/models/katello/host/content_facet.rb +2 -27
  50. data/app/models/katello/host/info_provider.rb +9 -0
  51. data/app/models/katello/host/subscription_facet.rb +2 -2
  52. data/app/models/katello/hostgroup/content_facet.rb +2 -2
  53. data/app/models/katello/product.rb +1 -1
  54. data/app/models/katello/product_content.rb +2 -2
  55. data/app/models/katello/repository.rb +10 -9
  56. data/app/models/katello/root_repository.rb +24 -13
  57. data/app/models/katello/rpm.rb +8 -2
  58. data/app/models/setting/content.rb +6 -3
  59. data/app/services/cert/rhsm_client.rb +1 -5
  60. data/app/services/katello/content_unit_indexer.rb +166 -0
  61. data/app/services/katello/organization_creator.rb +12 -4
  62. data/app/services/katello/pulp/repository/docker.rb +1 -1
  63. data/app/services/katello/pulp/repository/yum.rb +0 -54
  64. data/app/services/katello/pulp/repository.rb +0 -6
  65. data/app/services/katello/pulp3/ansible_collection.rb +26 -10
  66. data/app/services/katello/pulp3/api/apt.rb +7 -0
  67. data/app/services/katello/pulp3/content_view_version/import.rb +11 -2
  68. data/app/services/katello/pulp3/deb.rb +10 -9
  69. data/app/services/katello/pulp3/docker_manifest.rb +6 -5
  70. data/app/services/katello/pulp3/docker_manifest_list.rb +23 -6
  71. data/app/services/katello/pulp3/docker_tag.rb +16 -7
  72. data/app/services/katello/pulp3/erratum.rb +51 -56
  73. data/app/services/katello/pulp3/file_unit.rb +9 -6
  74. data/app/services/katello/pulp3/generic_content_unit.rb +11 -12
  75. data/app/services/katello/pulp3/module_stream.rb +76 -30
  76. data/app/services/katello/pulp3/package_group.rb +5 -5
  77. data/app/services/katello/pulp3/pulp_content_unit.rb +19 -11
  78. data/app/services/katello/pulp3/repository/apt.rb +5 -3
  79. data/app/services/katello/pulp3/repository/docker.rb +14 -7
  80. data/app/services/katello/pulp3/repository/generic.rb +1 -1
  81. data/app/services/katello/pulp3/repository/yum.rb +10 -12
  82. data/app/services/katello/pulp3/repository.rb +26 -7
  83. data/app/services/katello/pulp3/repository_mirror.rb +18 -5
  84. data/app/services/katello/pulp3/rpm.rb +13 -13
  85. data/app/services/katello/pulp3/srpm.rb +10 -9
  86. data/app/services/katello/repository_type.rb +15 -4
  87. data/app/services/katello/repository_type_manager.rb +1 -1
  88. data/app/services/katello/ui_notifications/subscriptions/manifest_expired_warning.rb +1 -1
  89. data/app/services/katello/upstream_connection_checker.rb +2 -2
  90. data/app/views/foreman/job_templates/change_content_source.erb +1 -31
  91. data/app/views/foreman/job_templates/install_errata.erb +6 -9
  92. data/app/views/foreman/job_templates/install_errata_by_search_query.erb +26 -0
  93. data/app/views/foreman/job_templates/install_packages_by_search_query.erb +19 -0
  94. data/app/views/katello/api/v2/cdn_configurations/show.json.rabl +1 -1
  95. data/app/views/katello/api/v2/environments/show.json.rabl +9 -0
  96. data/app/views/katello/api/v2/repositories/show.json.rabl +2 -0
  97. data/app/views/katello/layouts/react.html.erb +0 -1
  98. data/app/views/katello/sync_management/_repo.html.erb +36 -25
  99. data/config/initializers/monkeys.rb +0 -1
  100. data/config/routes/api/v2.rb +1 -0
  101. data/config/routes/overrides.rb +3 -0
  102. data/config/routes.rb +2 -0
  103. data/db/migrate/20150930183738_migrate_content_hosts.rb +1 -1
  104. data/db/migrate/20180612164926_add_content_org_id.rb +2 -2
  105. data/db/migrate/20211201154845_add_unique_indexes.rb +20 -0
  106. data/db/migrate/20211208034230_add_content_view_and_lifecycle_environment.rb +6 -0
  107. data/db/migrate/20211220185935_clean_duplicate_content_units.rb +144 -0
  108. data/db/migrate/20220110223754_update_disconnected_settings.rb +20 -0
  109. data/db/migrate/20220120163252_fix_docker_download_policy.rb +11 -0
  110. data/db/migrate/20220124191056_add_type_to_cdn_configuration.rb +22 -0
  111. data/db/migrate/20220127120843_fix_debian_download_policy.rb +11 -0
  112. data/db/migrate/20220204171908_rename_docker_tags_whitelist_and_add_exclude_tags.rb +8 -0
  113. data/db/migrate/20220207140355_change_deb_attributes_size_limit.rb +7 -0
  114. data/db/seeds.d/111-upgrade_tasks.rb +2 -1
  115. data/engines/bastion/app/views/bastion/layouts/application.html.erb +0 -1
  116. data/engines/bastion/app/views/bastion/layouts/assets.html.erb +0 -1
  117. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/content-credentials.controller.js +1 -1
  118. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/details/content-credential-products.controller.js +1 -1
  119. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/details/content-credential-repositories.controller.js +1 -1
  120. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/bulk/views/content-hosts-bulk-traces-modal.html +1 -1
  121. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/details/views/environment.html +26 -1
  122. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/bastion_katello.pot +212 -152
  123. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/packages/packages.controller.js +1 -0
  124. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details-info.controller.js +20 -8
  125. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details-manage-content.controller.js +2 -3
  126. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details.controller.js +8 -3
  127. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-info.html +34 -30
  128. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/new-repository.controller.js +16 -2
  129. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/views/new-repository.html +35 -15
  130. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/discovery/discovery.controller.js +5 -4
  131. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/products.routes.js +4 -3
  132. data/lib/katello/engine.rb +4 -0
  133. data/lib/katello/permission_creator.rb +1 -1
  134. data/lib/katello/permissions/host_permissions.rb +3 -1
  135. data/lib/katello/plugin.rb +4 -1
  136. data/lib/katello/repository_types/deb.rb +0 -1
  137. data/lib/katello/repository_types/docker.rb +4 -4
  138. data/lib/katello/repository_types/file.rb +0 -1
  139. data/lib/katello/repository_types/ostree.rb +4 -0
  140. data/lib/katello/repository_types/python.rb +5 -1
  141. data/lib/katello/repository_types/yum.rb +2 -9
  142. data/lib/katello/tasks/content_view_import_only.rake +34 -0
  143. data/lib/katello/tasks/import_applicability.rake +1 -1
  144. data/lib/katello/tasks/jenkins.rake +0 -2
  145. data/lib/katello/tasks/repository.rake +4 -1
  146. data/lib/katello/tasks/upgrades/4.4/publish_import_cvvs.rake +17 -0
  147. data/lib/katello/version.rb +1 -1
  148. data/locale/action_names.rb +8 -7
  149. data/locale/bn/katello.po +1402 -650
  150. data/locale/cs/katello.po +1217 -96
  151. data/locale/de/katello.po +2359 -1347
  152. data/locale/en/katello.po +1216 -94
  153. data/locale/es/katello.po +2201 -1172
  154. data/locale/fr/katello.po +2601 -1615
  155. data/locale/gu/katello.po +1564 -814
  156. data/locale/hi/katello.po +1563 -810
  157. data/locale/it/katello.po +1311 -282
  158. data/locale/ja/katello.po +2534 -1518
  159. data/locale/katello.pot +3430 -1326
  160. data/locale/kn/katello.po +1564 -812
  161. data/locale/ko/katello.po +1441 -409
  162. data/locale/mr/katello.po +1564 -776
  163. data/locale/or/katello.po +1565 -813
  164. data/locale/pa/katello.po +1559 -792
  165. data/locale/pt/katello.po +1314 -277
  166. data/locale/pt_BR/katello.po +2226 -1181
  167. data/locale/ru/katello.po +1587 -563
  168. data/locale/ta/katello.po +1373 -619
  169. data/locale/te/katello.po +1564 -810
  170. data/locale/zh_CN/katello.po +2936 -1890
  171. data/locale/zh_TW/katello.po +1508 -606
  172. data/webpack/__mocks__/foremanReact/{redux/actions/toasts.js → components/ToastsList/index.js} +3 -2
  173. data/webpack/components/ActionableDetail.js +35 -21
  174. data/webpack/components/Content/Details/__tests__/ContentDetailInfo.test.js +0 -2
  175. data/webpack/components/Content/Details/__tests__/ContentDetailRepositories.test.js +0 -2
  176. data/webpack/components/Content/Details/__tests__/ContentDetails.test.js +0 -2
  177. data/webpack/components/Content/__tests__/ContentPage.test.js +0 -2
  178. data/webpack/components/Content/__tests__/ContentTable.test.js +0 -2
  179. data/webpack/components/EditableSwitch.js +8 -2
  180. data/webpack/components/EditableTextInput/EditableTextInput.js +44 -86
  181. data/webpack/components/EditableTextInput/__tests__/editableTextInput.test.js +3 -3
  182. data/webpack/components/Errata/index.js +19 -11
  183. data/webpack/components/Packages/index.js +1 -1
  184. data/webpack/components/Search/Search.js +5 -2
  185. data/webpack/components/Search/__tests__/search.test.js +2 -3
  186. data/webpack/components/SelectOrg/SetOrganization.js +1 -1
  187. data/webpack/components/Table/PageControls.js +3 -6
  188. data/webpack/components/Table/TableHooks.js +46 -7
  189. data/webpack/components/Table/TableWrapper.js +14 -3
  190. data/webpack/components/TypeAhead/TypeAhead.js +5 -1
  191. data/webpack/components/TypeAhead/pf4Search/TypeAheadInput.js +4 -1
  192. data/webpack/components/TypeAhead/pf4Search/TypeAheadSearch.js +2 -1
  193. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard.js +1 -1
  194. data/webpack/components/extensions/HostDetails/Cards/ErrataOverviewCard.js +3 -4
  195. data/webpack/components/extensions/HostDetails/HostDetailsActions.js +2 -0
  196. data/webpack/components/extensions/HostDetails/HostPackages/HostPackagesActions.js +18 -2
  197. data/webpack/components/extensions/HostDetails/HostPackages/HostPackagesConstants.js +12 -0
  198. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/SecondaryTabsRoutes.js +1 -1
  199. data/webpack/components/extensions/HostDetails/Tabs/{ErrataTab.js → ErrataTab/ErrataTab.js} +30 -21
  200. data/webpack/components/extensions/HostDetails/Tabs/{ErrataTab.scss → ErrataTab/ErrataTab.scss} +0 -0
  201. data/webpack/components/extensions/HostDetails/Tabs/{ErratumExpansionContents.js → ErrataTab/ErratumExpansionContents.js} +0 -0
  202. data/webpack/components/extensions/HostDetails/Tabs/{ErratumExpansionDetail.js → ErrataTab/ErratumExpansionDetail.js} +0 -0
  203. data/webpack/components/extensions/HostDetails/{HostErrata → Tabs/ErrataTab}/HostErrataActions.js +3 -3
  204. data/webpack/components/extensions/HostDetails/{HostErrata → Tabs/ErrataTab}/HostErrataConstants.js +11 -0
  205. data/webpack/components/extensions/HostDetails/{HostErrata → Tabs/ErrataTab}/HostErrataSelectors.js +0 -0
  206. data/webpack/components/extensions/HostDetails/Tabs/PackageInstallModal.js +279 -0
  207. data/webpack/components/extensions/HostDetails/Tabs/PackageInstallModal.scss +3 -0
  208. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab.js +125 -8
  209. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionActions.js +27 -4
  210. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionConstants.js +2 -1
  211. data/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsTab.js +6 -3
  212. data/webpack/components/extensions/HostDetails/Tabs/{EnableTracerEmptyState.js → TracesTab/EnableTracerEmptyState.js} +0 -0
  213. data/webpack/components/extensions/HostDetails/Tabs/{EnableTracerModal.js → TracesTab/EnableTracerModal.js} +3 -2
  214. data/webpack/components/extensions/HostDetails/Tabs/{HostTracesActions.js → TracesTab/HostTracesActions.js} +2 -2
  215. data/webpack/components/extensions/HostDetails/Tabs/{HostTracesConstants.js → TracesTab/HostTracesConstants.js} +0 -0
  216. data/webpack/components/extensions/HostDetails/Tabs/{HostTracesSelectors.js → TracesTab/HostTracesSelectors.js} +0 -0
  217. data/webpack/components/extensions/HostDetails/Tabs/{TracesTab.js → TracesTab/TracesTab.js} +8 -5
  218. data/webpack/components/extensions/HostDetails/Tabs/{TracesTab.scss → TracesTab/TracesTab.scss} +0 -0
  219. data/webpack/components/extensions/HostDetails/Tabs/__tests__/errataTab.test.js +17 -18
  220. data/webpack/components/extensions/HostDetails/Tabs/__tests__/packageInstallModal.test.js +385 -0
  221. data/webpack/components/extensions/HostDetails/Tabs/__tests__/packages.fixtures.json +1 -1
  222. data/webpack/components/extensions/HostDetails/Tabs/__tests__/packagesTab.test.js +58 -7
  223. data/webpack/components/extensions/HostDetails/Tabs/__tests__/repositorySetsTab.test.js +2 -2
  224. data/webpack/components/extensions/HostDetails/Tabs/__tests__/tracesTab.test.js +4 -4
  225. data/webpack/components/extensions/HostDetails/Tabs/__tests__/yumInstallablePackages.fixtures.json +72 -0
  226. data/webpack/components/extensions/HostDetails/Tabs/customizedRexUrlHelpers.js +12 -5
  227. data/webpack/components/extensions/HostDetails/YumInstallablePackages/YumInstallablePackagesActions.js +18 -0
  228. data/webpack/components/extensions/HostDetails/YumInstallablePackages/YumInstallablePackagesConstants.js +3 -0
  229. data/webpack/components/extensions/HostDetails/YumInstallablePackages/YumInstallablePackagesSelectors.js +16 -0
  230. data/webpack/components/extensions/HostDetails/hostDetailsHelpers.js +19 -0
  231. data/webpack/components/pf3Table/components/Table.js +2 -3
  232. data/webpack/components/pf3Table/components/Table.test.js +0 -3
  233. data/webpack/components/pf3Table/components/__snapshots__/Table.test.js.snap +9 -8
  234. data/webpack/containers/Application/config.js +5 -0
  235. data/webpack/global_index.js +1 -1
  236. data/webpack/global_test_setup.js +1 -1
  237. data/webpack/index.js +7 -0
  238. data/webpack/scenes/AnsibleCollections/Details/__tests__/AnsibleCollectionDetails.test.js +0 -2
  239. data/webpack/scenes/AnsibleCollections/__tests__/AnsibleCollectionPage.test.js +0 -2
  240. data/webpack/scenes/AnsibleCollections/__tests__/AnsibleCollectionsTable.test.js +0 -2
  241. data/webpack/scenes/Content/ContentConfig.js +55 -5
  242. data/webpack/scenes/Content/ContentPage.js +1 -1
  243. data/webpack/scenes/Content/Details/ContentDetails.js +1 -1
  244. data/webpack/scenes/Content/Details/ContentInfo.js +1 -1
  245. data/webpack/scenes/Content/Details/ContentRepositories.js +1 -1
  246. data/webpack/scenes/Content/Details/__tests__/contentDetail.test.js +4 -4
  247. data/webpack/scenes/Content/Table/ContentTable.js +1 -1
  248. data/webpack/scenes/Content/__tests__/contentTable.test.js +3 -3
  249. data/webpack/scenes/ContentViews/ContentViewsConstants.js +2 -1
  250. data/webpack/scenes/ContentViews/Delete/__tests__/contentViewDelete.test.js +6 -6
  251. data/webpack/scenes/ContentViews/Details/ComponentContentViews/__tests__/contentViewComponents.test.js +2 -2
  252. data/webpack/scenes/ContentViews/Details/ContentViewDetailActions.js +21 -27
  253. data/webpack/scenes/ContentViews/Details/ContentViewDetailSelectors.js +5 -5
  254. data/webpack/scenes/ContentViews/Details/ContentViewInfo.js +8 -3
  255. data/webpack/scenes/ContentViews/Details/DetailsContainer.js +11 -16
  256. data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilterDetails.js +2 -2
  257. data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilterDetailsHeader.js +14 -8
  258. data/webpack/scenes/ContentViews/Details/Filters/MatchContentModal/__tests__/CVRpmMatchContentModal.test.js +2 -2
  259. data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVContainerImageFilterContent.test.js +2 -3
  260. data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVRpmFilterContent.test.js +2 -9
  261. data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilterDetails.test.js +3 -5
  262. data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilters.test.js +2 -10
  263. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvErrataIDFilter.test.js +2 -3
  264. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvModuleStreamFilter.test.js +2 -3
  265. data/webpack/scenes/ContentViews/Details/Histories/__tests__/contentViewHistory.test.js +2 -2
  266. data/webpack/scenes/ContentViews/Details/Repositories/ContentCounts.js +1 -1
  267. data/webpack/scenes/ContentViews/Details/Repositories/ContentViewRepositories.js +23 -2
  268. data/webpack/scenes/ContentViews/Details/Repositories/__tests__/contentViewAddRemove.test.js +11 -5
  269. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersionContent.js +16 -17
  270. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersions.js +1 -1
  271. data/webpack/scenes/ContentViews/Details/Versions/Delete/__tests__/cvVersionRemove.test.js +6 -6
  272. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailConfig.js +30 -34
  273. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetails.js +9 -8
  274. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailsHeader.js +13 -15
  275. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionRepositoryCell.js +1 -1
  276. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetails.test.js +4 -4
  277. data/webpack/scenes/ContentViews/Details/Versions/__tests__/contentViewVersions.test.js +3 -3
  278. data/webpack/scenes/ContentViews/Details/__tests__/contentViewDetail.test.js +5 -3
  279. data/webpack/scenes/ContentViews/__tests__/contentViewPage.test.js +2 -2
  280. data/webpack/scenes/Hosts/ChangeContentSource/actions.js +43 -0
  281. data/webpack/scenes/Hosts/ChangeContentSource/components/ContentSourceForm.js +87 -0
  282. data/webpack/scenes/Hosts/ChangeContentSource/components/ContentSourceTemplate.js +90 -0
  283. data/webpack/scenes/Hosts/ChangeContentSource/components/FormField.js +43 -0
  284. data/webpack/scenes/Hosts/ChangeContentSource/constants.js +3 -0
  285. data/webpack/scenes/Hosts/ChangeContentSource/helpers.js +27 -0
  286. data/webpack/scenes/Hosts/ChangeContentSource/index.js +126 -0
  287. data/webpack/scenes/Hosts/ChangeContentSource/selectors.js +42 -0
  288. data/webpack/scenes/Hosts/ChangeContentSource/styles.scss +11 -0
  289. data/webpack/scenes/ModuleStreams/Details/Profiles/__tests__/ModuleStreamDetailProfiles.test.js +0 -1
  290. data/webpack/scenes/ModuleStreams/Details/__tests__/ModuleStreamDetails.test.js +0 -2
  291. data/webpack/scenes/ModuleStreams/__tests__/ModuleStreamPage.test.js +0 -2
  292. data/webpack/scenes/ModuleStreams/__tests__/ModuleStreamsTable.test.js +0 -2
  293. data/webpack/scenes/Organizations/OrganizationActions.js +5 -1
  294. data/webpack/scenes/RedHatRepositories/RedHatRepositoriesPage.js +31 -1
  295. data/webpack/scenes/RedHatRepositories/__tests__/RedHatRepositoriesPage.test.js +16 -0
  296. data/webpack/scenes/RedHatRepositories/__tests__/__snapshots__/RedHatRepositoriesPage.test.js.snap +11 -2
  297. data/webpack/scenes/RedHatRepositories/helpers.js +5 -5
  298. data/webpack/scenes/RedHatRepositories/index.js +11 -3
  299. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/AirGappedTypeForm.js +81 -0
  300. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/CdnConfigurationConstants.js +13 -0
  301. data/webpack/scenes/Subscriptions/Manifest/{CdnConfigurationForm.scss → CdnConfigurationTab/CdnConfigurationForm.scss} +0 -0
  302. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/CdnTypeForm.js +106 -0
  303. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/UpstreamServerTypeForm.js +259 -0
  304. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/__tests__/AirGappedTypeForm.test.js +44 -0
  305. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/__tests__/CdnTypeForm.test.js +67 -0
  306. data/webpack/scenes/Subscriptions/Manifest/{__tests__/CdnConfigurationForm.test.js → CdnConfigurationTab/__tests__/UpstreamServerTypeForm.test.js} +46 -17
  307. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/index.js +97 -0
  308. data/webpack/scenes/Subscriptions/Manifest/ManageManifestModal.js +6 -1
  309. data/webpack/scenes/Subscriptions/UpstreamSubscriptions/__tests__/UpstreamSubscriptionsPage.test.js +0 -1
  310. data/webpack/scenes/Subscriptions/__tests__/SubscriptionsPage.test.js +0 -1
  311. data/webpack/scenes/Subscriptions/__tests__/__snapshots__/SubscriptionsActions.test.js.snap +3 -2
  312. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/__tests__/SubscriptionsTable.test.js +4 -0
  313. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/__tests__/__snapshots__/SubscriptionsTable.test.js.snap +9 -0
  314. data/webpack/scenes/Tasks/TaskActions.js +1 -1
  315. data/webpack/scenes/Tasks/__tests__/__snapshots__/TaskActions.test.js.snap +3 -2
  316. data/webpack/services/api/testHelpers.js +5 -3
  317. data/webpack/utils/helpers.js +6 -3
  318. metadata +81 -58
  319. data/app/services/katello/pulp/deb.rb +0 -55
  320. data/app/services/katello/pulp/distribution.rb +0 -7
  321. data/app/services/katello/pulp/docker_blob.rb +0 -7
  322. data/app/services/katello/pulp/docker_manifest.rb +0 -13
  323. data/app/services/katello/pulp/docker_manifest_list.rb +0 -14
  324. data/app/services/katello/pulp/docker_tag.rb +0 -14
  325. data/app/services/katello/pulp/erratum.rb +0 -129
  326. data/app/services/katello/pulp/file_unit.rb +0 -21
  327. data/app/services/katello/pulp/module_stream.rb +0 -39
  328. data/app/services/katello/pulp/package_category.rb +0 -7
  329. data/app/services/katello/pulp/package_group.rb +0 -20
  330. data/app/services/katello/pulp/pulp_content_unit.rb +0 -156
  331. data/app/services/katello/pulp/rpm.rb +0 -57
  332. data/app/services/katello/pulp/srpm.rb +0 -29
  333. data/app/services/katello/pulp/yum_metadata_file.rb +0 -30
  334. data/lib/monkeys/pulp3_13_checksumfix.rb +0 -17
  335. data/webpack/__mocks__/foremanReact/components/Pagination/PaginationHooks.js +0 -2
  336. data/webpack/__mocks__/foremanReact/components/Pagination/PaginationWrapper.js +0 -2
  337. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationForm.js +0 -185
@@ -21,6 +21,7 @@ angular.module('Bastion.packages').controller('PackagesController',
21
21
  var nutupane, params = {
22
22
  'organization_id': CurrentOrganization,
23
23
  'search': $location.search().search || "",
24
+ 'repository_id': $location.search().repositoryId || null,
24
25
  'paged': true
25
26
  };
26
27
 
@@ -108,20 +108,27 @@ angular.module('Bastion.repositories').controller('RepositoryDetailsInfoControll
108
108
 
109
109
  if ($scope.genericRemoteOptions && $scope.genericRemoteOptions !== []) {
110
110
  $scope.genericRemoteOptions.forEach(function(option) {
111
- if (option.type === "Array" && option.value) {
112
- repository[option.name] = option.value.split(option.delimiter);
111
+ if (option.type === "Array") {
112
+ repository[option.name] = option.value ? option.value.split(option.delimiter) : [];
113
113
  } else {
114
114
  repository[option.name] = option.value;
115
115
  }
116
116
  });
117
117
  }
118
118
 
119
- if (!_.isEmpty(repository.commaTagsWhitelist)) {
120
- repository["docker_tags_whitelist"] = repository.commaTagsWhitelist.split(",").map(function(tag) {
119
+ if (!_.isEmpty(repository.commaIncludeTags)) {
120
+ repository["include_tags"] = repository.commaIncludeTags.split(",").map(function(tag) {
121
121
  return tag.trim();
122
122
  });
123
123
  } else {
124
- repository["docker_tags_whitelist"] = [];
124
+ repository["include_tags"] = [];
125
+ }
126
+ if (!_.isEmpty(repository.commaExcludeTags)) {
127
+ repository["exclude_tags"] = repository.commaExcludeTags.split(",").map(function(tag) {
128
+ return tag.trim();
129
+ });
130
+ } else {
131
+ repository["exclude_tags"] = [];
125
132
  }
126
133
  /* eslint-disable camelcase */
127
134
 
@@ -134,10 +141,15 @@ angular.module('Bastion.repositories').controller('RepositoryDetailsInfoControll
134
141
  repository.$update(function (response) {
135
142
  deferred.resolve(response);
136
143
  $scope.repository.ignore_srpms = $scope.repository.ignorable_content && $scope.repository.ignorable_content.includes("srpm");
137
- if (!_.isEmpty(response["docker_tags_whitelist"])) {
138
- repository.commaTagsWhitelist = repository["docker_tags_whitelist"].join(", ");
144
+ if (!_.isEmpty(response["include_tags"])) {
145
+ repository.commaIncludeTags = repository["include_tags"].join(", ");
146
+ } else {
147
+ repository.commaIncludeTags = null;
148
+ }
149
+ if (!_.isEmpty(response["exclude_tags"])) {
150
+ repository.commaExcludeTags = repository["exclude_tags"].join(", ");
139
151
  } else {
140
- repository.commaTagsWhitelist = null;
152
+ repository.commaExcludeTags = null;
141
153
  }
142
154
  Notification.setSuccessMessage(translate('Repository Saved.'));
143
155
  }, function (response) {
@@ -13,7 +13,6 @@
13
13
  * @requires DockerManifest
14
14
  * @requires DockerManifestList
15
15
  * @requires DockerTag
16
- * @requires OstreeBranch
17
16
  * @requires File
18
17
  * @requires Deb
19
18
  * @requires ModuleStream
@@ -25,8 +24,8 @@
25
24
  * Provides the functionality for the repository details pane.
26
25
  */
27
26
  angular.module('Bastion.repositories').controller('RepositoryManageContentController',
28
- ['$scope', '$state', 'translate', 'Notification', 'Nutupane', 'Repository', 'Package', 'PackageGroup', 'DockerManifest', 'DockerManifestList', 'DockerTag', 'OstreeBranch', 'File', 'Deb', 'ModuleStream', 'AnsibleCollection', 'GenericContent', 'RepositoryTypesService',
29
- function ($scope, $state, translate, Notification, Nutupane, Repository, Package, PackageGroup, DockerManifest, DockerManifestList, DockerTag, OstreeBranch, File, Deb, ModuleStream, AnsibleCollection, GenericContent, RepositoryTypesService) {
27
+ ['$scope', '$state', 'translate', 'Notification', 'Nutupane', 'Repository', 'Package', 'PackageGroup', 'DockerManifest', 'DockerManifestList', 'DockerTag', 'File', 'Deb', 'ModuleStream', 'AnsibleCollection', 'GenericContent', 'RepositoryTypesService',
28
+ function ($scope, $state, translate, Notification, Nutupane, Repository, Package, PackageGroup, DockerManifest, DockerManifestList, DockerTag, File, Deb, ModuleStream, AnsibleCollection, GenericContent, RepositoryTypesService) {
30
29
  var contentTypes, nutupaneParams;
31
30
 
32
31
  function success(response, selected) {
@@ -53,10 +53,15 @@
53
53
  'product_id': $scope.$stateParams.productId,
54
54
  'id': $scope.$stateParams.repositoryId
55
55
  }, function () {
56
- if (!_.isEmpty($scope.repository["docker_tags_whitelist"])) {
57
- $scope.repository.commaTagsWhitelist = $scope.repository["docker_tags_whitelist"].join(", ");
56
+ if (!_.isEmpty($scope.repository["include_tags"])) {
57
+ $scope.repository.commaIncludeTags = $scope.repository["include_tags"].join(", ");
58
58
  } else {
59
- $scope.repository.commaTagsWhitelist = "";
59
+ $scope.repository.commaIncludeTags = "";
60
+ }
61
+ if (!_.isEmpty($scope.repository["exclude_tags"])) {
62
+ $scope.repository.commaExcludeTags = $scope.repository["exclude_tags"].join(", ");
63
+ } else {
64
+ $scope.repository.commaExcludeTags = "";
60
65
  }
61
66
  $scope.page.loading = false;
62
67
  $scope.repositoryWrapper.repository = $scope.repository;
@@ -28,31 +28,37 @@
28
28
  </dl>
29
29
 
30
30
  <div class="divider"></div>
31
+
32
+ <div ng-show="repository.content_type === 'yum'" >
33
+ <h4 translate>Publishing Settings</h4>
34
+
35
+ <dl class="dl-horizontal dl-horizontal-left">
36
+ <dt>
37
+ <span translate>Restrict to architecture</span>
38
+ <i class="pficon-info" title="{{ 'The repository will be enabled by default on content hosts with the selected architecture.' | translate }}"></i>
39
+ </dt>
40
+ <dd bst-edit-select="repository.arch==='noarch'?'No restriction':repository.arch"
41
+ selector="repository.arch"
42
+ options="architectures()"
43
+ on-save="save(repository)">
44
+ </dd>
45
+
46
+ <dt>
47
+ <span translate>Restrict to <br />OS version</span>
48
+ <i class="pficon-info" title="{{ 'The repository will be enabled by default on content hosts with the selected OS version.' | translate }}"></i>
49
+ </dt>
50
+ <dd bst-edit-select="repository.os_versions.length ? formatOSVersions() : 'No restriction'"
51
+ selector="selectedOSVersion"
52
+ options="osVersionsOptions()"
53
+ on-save="save(repository)">
54
+ </dd>
55
+ </dl>
56
+ <div class="divider"></div>
57
+ </div>
58
+
31
59
  <h4 translate>Sync Settings</h4>
32
- <dl class="dl-horizontal dl-horizontal-left">
33
- <span ng-show="repository.content_type === 'yum'" >
34
- <dt>
35
- <span translate>Restrict to architecture</span>
36
- <i class="pficon-info" title="{{ 'The repository will be enabled by default on content hosts with the selected architecture.' | translate }}"></i>
37
- </dt>
38
- <dd bst-edit-select="repository.arch==='noarch'?'No restriction':repository.arch"
39
- selector="repository.arch"
40
- options="architectures()"
41
- on-save="save(repository)">
42
- </dd>
43
- </span>
44
60
 
45
- <span ng-show="repository.content_type === 'yum'" >
46
- <dt>
47
- <span translate>Restrict to <br />OS version</span>
48
- <i class="pficon-info" title="{{ 'The repository will be enabled by default on content hosts with the selected OS version.' | translate }}"></i>
49
- </dt>
50
- <dd bst-edit-select="repository.os_versions.length ? formatOSVersions() : 'No restriction'"
51
- selector="selectedOSVersion"
52
- options="osVersionsOptions()"
53
- on-save="save(repository)">
54
- </dd>
55
- </span>
61
+ <dl class="dl-horizontal dl-horizontal-left">
56
62
 
57
63
  <dt ng-show="repository.content_type !== 'docker'" translate>Upstream URL</dt>
58
64
  <dt ng-show="repository.content_type === 'docker'" translate>Registry URL</dt>
@@ -304,7 +310,7 @@
304
310
  options="certs()"
305
311
  on-save="save(repository)">
306
312
  </dd>
307
- <span ng-if="repository.content_type == 'yum' || repository.content_type == 'deb'">
313
+ <span ng-if="repository.content_type == 'yum' || repository.content_type == 'deb' || repository.content_type == 'docker'">
308
314
  <dt translate>Download Policy</dt>
309
315
  <dd bst-edit-select="downloadPolicyDisplay(repository.download_policy)"
310
316
  readonly="denied('edit_products', product)"
@@ -326,15 +332,13 @@
326
332
  </dd>
327
333
  </span>
328
334
  <span ng-if="repository.content_type == 'docker'">
329
- <dt translate>Limit Sync Tags</dt>
330
- <dd bst-edit-text="repository.commaTagsWhitelist"
335
+ <dt translate>Include Tags</dt>
336
+ <dd bst-edit-text="repository.commaIncludeTags"
331
337
  on-save="save(repository)"
332
338
  readonly="denied('edit_products', product)">
333
339
  </dd>
334
- </span>
335
- <span ng-if="repository.content_type == 'docker'">
336
- <dt translate>Limit Sync Tags</dt>
337
- <dd bst-edit-text="repository.commaTagsWhitelist"
340
+ <dt translate>Exclude Tags</dt>
341
+ <dd bst-edit-text="repository.commaExcludeTags"
338
342
  on-save="save(repository)"
339
343
  readonly="denied('edit_products', product)">
340
344
  </dd>
@@ -64,7 +64,7 @@ angular.module('Bastion.repositories').controller('NewRepositoryController',
64
64
  $scope.repository = new Repository({'product_id': $scope.$stateParams.productId, unprotected: true,
65
65
  'checksum_type': null, 'verify_ssl_on_sync': true,
66
66
  'download_policy': BastionConfig.defaultDownloadPolicy, 'arch': null,
67
- 'mirroring_policy': MirroringPolicy.defaultMirroringPolicy});
67
+ 'mirroring_policy': MirroringPolicy.defaultMirroringPolicy, 'include_tags': '', 'exclude_tags': '*-source'});
68
68
 
69
69
  $scope.product = Product.get({id: $scope.$stateParams.productId}, function () {
70
70
  $scope.page.loading = false;
@@ -138,7 +138,7 @@ angular.module('Bastion.repositories').controller('NewRepositoryController',
138
138
  repository.ignorable_content = [];
139
139
  }
140
140
  }
141
- if (repository.content_type !== 'yum' && repository.content_type !== 'deb' ) {
141
+ if (repository.content_type !== 'yum' && repository.content_type !== 'deb' && repository.content_type !== 'docker') {
142
142
  repository['download_policy'] = '';
143
143
  }
144
144
  if (repository.arch === 'No restriction') {
@@ -160,6 +160,20 @@ angular.module('Bastion.repositories').controller('NewRepositoryController',
160
160
  }
161
161
  });
162
162
  }
163
+ if (!_.isEmpty(repository.include_tags)) {
164
+ repository["include_tags"] = repository.include_tags.split(",").map(function(tag) {
165
+ return tag.trim();
166
+ });
167
+ } else {
168
+ repository["include_tags"] = [];
169
+ }
170
+ if (!_.isEmpty(repository.exclude_tags)) {
171
+ repository["exclude_tags"] = repository.exclude_tags.split(",").map(function(tag) {
172
+ return tag.trim();
173
+ });
174
+ } else {
175
+ repository["exclude_tags"] = [];
176
+ }
163
177
  repository.$save(success, error);
164
178
  };
165
179
 
@@ -39,29 +39,33 @@
39
39
  </select>
40
40
  </div>
41
41
 
42
- <div bst-form-group label="{{ 'Restrict to Architecture' | translate }}" ng-show="repository.content_type === 'yum'">
42
+ </div>
43
+
44
+ <div ng-show="repository.content_type === 'yum'">
45
+ <h4 translate> Publishing Settings </h4>
46
+ <div bst-form-group label="{{ 'Restrict to Architecture' | translate }}">
43
47
  <select id="architecture_restricted"
44
48
  name="architecture_restricted"
45
49
  ng-model="repository.arch"
46
50
  ng-options="arch.id as arch.name for arch in architecture">
47
51
  </select>
52
+ <p class="help-block" translate>
53
+ The repository will be enabled by default on content hosts with the selected architecture.
54
+ </p>
48
55
  </div>
49
56
 
50
- <div
51
- bst-form-group label="{{ 'Restrict to OS version' | translate }}"
52
- ng-if="repository.content_type === 'yum'"
53
- >
54
- <select id="os_versions"
55
- name="os_versions"
56
- ng-model="repository.os_versions"
57
- ng-options="tag as tag.name for tag in osVersionsOptions track by tag.id">
58
- </select>
59
- <p class="help-block" translate>
60
- The repository will be enabled by default on content hosts with the selected OS version.
61
- </p>
57
+ <div bst-form-group label="{{ 'Restrict to OS version' | translate }}">
58
+ <select id="os_versions"
59
+ name="os_versions"
60
+ ng-model="repository.os_versions"
61
+ ng-options="tag as tag.name for tag in osVersionsOptions track by tag.id">
62
+ </select>
63
+ <p class="help-block" translate>
64
+ The repository will be enabled by default on content hosts with the selected OS version.
65
+ </p>
62
66
  </div>
63
-
64
67
  </div>
68
+
65
69
  <div ng-show="repository.content_type !== undefined">
66
70
  <h4 translate> Sync Settings </h4>
67
71
  <div bst-form-group label="{{ 'Upstream URL' | translate }} ">
@@ -259,7 +263,7 @@
259
263
  </div>
260
264
  </div>
261
265
 
262
- <div bst-form-group label="{{ 'Download Policy' | translate }}" ng-if="repository.content_type === 'yum' || repository.content_type === 'deb'">
266
+ <div bst-form-group label="{{ 'Download Policy' | translate }}" ng-if="repository.content_type === 'yum' || repository.content_type === 'deb' || repository.content_type === 'docker'">
263
267
  <select id="download_policy"
264
268
  name="download_policy"
265
269
  ng-model="repository.download_policy"
@@ -288,6 +292,22 @@
288
292
  </p>
289
293
  </div>
290
294
 
295
+ <div bst-form-group label="{{ 'Include Tags' | translate }}" ng-if="(repository.content_type === 'docker')">
296
+ <input id="include_tags" name="include_tags" ng-model="repository.include_tags" type="text"/>
297
+
298
+ <p class="help-block">
299
+ <span translate>A comma-separated list of container image tags to include when syncing.</span><br />
300
+ </p>
301
+ </div>
302
+
303
+ <div bst-form-group label="{{ 'Exclude Tags' | translate }}" ng-if="(repository.content_type === 'docker')">
304
+ <input id="exclude_tags" name="exclude_tags" ng-model="repository.exclude_tags" type="text"/>
305
+
306
+ <p class="help-block">
307
+ <span translate>A comma-separated list of container image tags to exclude when syncing. Source images are excluded by default because they are often large and unwanted.</span><br />
308
+ </p>
309
+ </div>
310
+
291
311
  <div bst-form-group label="{{ 'Retain package versions' | translate }}" ng-if="(repository.content_type === 'yum' && repository.mirroring_policy === 'additive')">
292
312
  <input id="retain_package_versions_count" name="retain_package_versions_count" ng-model="repository.retain_package_versions_count" type="number"/>
293
313
 
@@ -4,8 +4,6 @@
4
4
  *
5
5
  * @requires $scope
6
6
  * @requires $q
7
- * @requires $timeout
8
- * @requires $http
9
7
  * @requires Notification
10
8
  * @requires Task
11
9
  * @requires Organization
@@ -18,8 +16,8 @@
18
16
  * Provides the functionality for the repo discovery action pane.
19
17
  */
20
18
  angular.module('Bastion.products').controller('DiscoveryController',
21
- ['$scope', '$q', '$timeout', '$http', '$filter', 'Notification', 'Task', 'Organization', 'CurrentOrganization', 'DiscoveryRepositories', 'ContainerRegistries', 'translate',
22
- function ($scope, $q, $timeout, $http, $filter, Notification, Task, Organization, CurrentOrganization, DiscoveryRepositories, ContainerRegistries, translate) {
19
+ ['$scope', '$q', '$filter', 'Notification', 'Task', 'Organization', 'CurrentOrganization', 'DiscoveryRepositories', 'ContainerRegistries', 'translate',
20
+ function ($scope, $q, $filter, Notification, Task, Organization, CurrentOrganization, DiscoveryRepositories, ContainerRegistries, translate) {
23
21
  var transformRows, setDiscoveryDetails;
24
22
 
25
23
  $scope.discovery = {
@@ -37,6 +35,9 @@ angular.module('Bastion.products').controller('DiscoveryController',
37
35
  {id: "docker", name: "Container Images"}
38
36
  ];
39
37
  $scope.hideSwitcher = true;
38
+
39
+ // scope.table may have been set when clicking in from products
40
+ // otherwise set a simple table since there is no BastionResource here
40
41
  if (!$scope.table) {
41
42
  $scope.table = {
42
43
  rows: [],
@@ -42,13 +42,14 @@ angular.module('Bastion.products').config(['$stateProvider', function ($statePro
42
42
  });
43
43
 
44
44
  $stateProvider.state("product-discovery", {
45
- abstract: true,
46
45
  url: '/products/discovery',
47
- controller: 'DiscoveryController',
48
- templateUrl: 'products/discovery/views/discovery-base.html'
46
+ templateUrl: 'products/discovery/views/discovery-base.html',
47
+ permission: 'edit_products',
48
+ redirectTo: 'product-discovery.scan'
49
49
  })
50
50
  .state("product-discovery.scan", {
51
51
  url: '/scan',
52
+ controller: 'DiscoveryController',
52
53
  permission: 'edit_products',
53
54
  templateUrl: 'products/discovery/views/discovery.html',
54
55
  ncyBreadcrumb: {
@@ -226,6 +226,10 @@ module Katello
226
226
  ::AuditSearch::ClassMethods.prepend Katello::Concerns::AuditSearch
227
227
  ::Widget.singleton_class.prepend Katello::Concerns::WidgetExtensions::ClassMethods
228
228
 
229
+ if ::Katello.with_remote_execution?
230
+ ::RemoteExecutionProxySelector.prepend Katello::Concerns::RemoteExecutionProxySelectorExtensions
231
+ end
232
+
229
233
  load 'katello/repository_types.rb'
230
234
  load 'katello/scheduled_jobs.rb'
231
235
 
@@ -124,7 +124,7 @@ module Katello
124
124
  :finder_scope => :editable
125
125
  @plugin.permission :destroy_content_views,
126
126
  {
127
- 'katello/api/v2/content_views' => [:destroy, :remove],
127
+ 'katello/api/v2/content_views' => [:destroy, :remove, :bulk_delete_versions],
128
128
  'katello/api/v2/content_view_versions' => [:destroy]
129
129
  },
130
130
  :resource_type => 'Katello::ContentView',
@@ -29,6 +29,7 @@ Foreman::AccessControl.permission(:edit_hosts).actions.concat [
29
29
  'katello/api/v2/hosts_bulk_actions/traces',
30
30
  'katello/api/v2/hosts_bulk_actions/resolve_traces',
31
31
  'katello/api/v2/hosts_bulk_actions/system_purpose',
32
+ 'katello/api/v2/hosts_bulk_actions/change_content_source',
32
33
  'katello/api/rhsm/candlepin_dynflow_proxy/upload_package_profile',
33
34
  'katello/api/rhsm/candlepin_dynflow_proxy/upload_profiles',
34
35
  'katello/api/rhsm/candlepin_dynflow_proxy/deb_package_profile',
@@ -36,7 +37,8 @@ Foreman::AccessControl.permission(:edit_hosts).actions.concat [
36
37
  'katello/api/rhsm/candlepin_proxies/hypervisors_update',
37
38
  'katello/api/rhsm/candlepin_proxies/async_hypervisors_update',
38
39
  'katello/api/rhsm/candlepin_proxies/hypervisors_heartbeat',
39
- 'katello/api/rhsm/candlepin_proxies/upload_tracer_profile'
40
+ 'katello/api/rhsm/candlepin_proxies/upload_tracer_profile',
41
+ 'hosts/change_content_source_data'
40
42
  ]
41
43
 
42
44
  Foreman::AccessControl.permission(:view_hosts).actions.concat [
@@ -299,16 +299,19 @@ Foreman::Plugin.register :katello do
299
299
 
300
300
  describe_host do
301
301
  overview_buttons_provider :content_host_overview_button
302
+ multiple_actions_provider :hosts_change_content_source
302
303
  end
303
304
 
304
305
  if Katello.with_remote_execution?
305
306
  RemoteExecutionFeature.register(:katello_package_install, N_("Katello: Install Package"), :description => N_("Install package via Katello interface"), :provided_inputs => ['package'])
307
+ RemoteExecutionFeature.register(:katello_package_install_by_search, N_("Katello: Install packages by search query"), :description => N_("Install packages via Katello interface"), :provided_inputs => ['Package search query'])
306
308
  RemoteExecutionFeature.register(:katello_package_update, N_("Katello: Update Package"), :description => N_("Update package via Katello interface"), :provided_inputs => ['package'])
307
309
  RemoteExecutionFeature.register(:katello_package_remove, N_("Katello: Remove Package"), :description => N_("Remove package via Katello interface"), :provided_inputs => ['package'])
308
310
  RemoteExecutionFeature.register(:katello_group_install, N_("Katello: Install Package Group"), :description => N_("Install package group via Katello interface"), :provided_inputs => ['package'])
309
311
  RemoteExecutionFeature.register(:katello_group_update, N_("Katello: Update Package Group"), :description => N_("Update package group via Katello interface"), :provided_inputs => ['package'])
310
312
  RemoteExecutionFeature.register(:katello_group_remove, N_("Katello: Remove Package Group"), :description => N_("Remove package group via Katello interface"), :provided_inputs => ['package'])
311
313
  RemoteExecutionFeature.register(:katello_errata_install, N_("Katello: Install Errata"), :description => N_("Install errata via Katello interface"), :provided_inputs => ['errata'])
314
+ RemoteExecutionFeature.register(:katello_errata_install_by_search, N_("Katello: Install errata by search query"), :description => N_("Install errata using scoped search query"), :provided_inputs => ['Errata search query'])
312
315
  RemoteExecutionFeature.register(:katello_service_restart, N_("Katello: Service Restart"), :description => N_("Restart Services via Katello interface"), :provided_inputs => ['helpers'])
313
316
  RemoteExecutionFeature.register(:katello_host_tracer_resolve, N_("Katello: Resolve Traces"), :description => N_("Resolve traces via Katello interface"), :provided_inputs => ['ids'])
314
317
  RemoteExecutionFeature.register(:katello_module_stream_action, N_("Katello: Module Stream Actions"),
@@ -339,7 +342,7 @@ Foreman::Plugin.register :katello do
339
342
 
340
343
  register_info_provider Katello::Host::InfoProvider
341
344
 
342
- medium_providers.register(Katello::ManagedContentMediumProvider)
345
+ medium_providers_registry.register(Katello::ManagedContentMediumProvider)
343
346
 
344
347
  Katello::PermissionCreator.new(self).define
345
348
  add_all_permissions_to_default_roles
@@ -20,7 +20,6 @@ Katello::RepositoryTypeManager.register(::Katello::Repository::DEB_TYPE) do
20
20
 
21
21
  default_managed_content_type Katello::Deb::CONTENT_TYPE
22
22
  content_type Katello::Deb,
23
- :pulp2_service_class => ::Katello::Pulp::Deb,
24
23
  :pulp3_service_class => ::Katello::Pulp3::Deb,
25
24
  :removable => true,
26
25
  :uploadable => true
@@ -19,24 +19,24 @@ Katello::RepositoryTypeManager.register(::Katello::Repository::DOCKER_TYPE) do
19
19
  distribution_class PulpContainerClient::ContainerContainerDistribution
20
20
  repo_sync_url_class PulpContainerClient::RepositorySyncURL
21
21
 
22
+ index_additional_data do |repo|
23
+ Katello::DockerMetaTag.import_meta_tags([repo])
24
+ end
25
+
22
26
  content_type Katello::DockerManifest,
23
27
  :priority => 1,
24
- :pulp2_service_class => ::Katello::Pulp::DockerManifest,
25
28
  :pulp3_service_class => ::Katello::Pulp3::DockerManifest,
26
29
  :removable => true,
27
30
  :uploadable => true
28
31
  content_type Katello::DockerManifestList,
29
32
  :priority => 2,
30
- :pulp2_service_class => ::Katello::Pulp::DockerManifestList,
31
33
  :pulp3_service_class => ::Katello::Pulp3::DockerManifestList
32
34
  content_type Katello::DockerTag,
33
35
  :priority => 3,
34
- :pulp2_service_class => ::Katello::Pulp::DockerTag,
35
36
  :pulp3_service_class => ::Katello::Pulp3::DockerTag,
36
37
  :primary_content => true
37
38
  content_type Katello::DockerBlob,
38
39
  :priority => 4,
39
- :pulp2_service_class => ::Katello::Pulp::DockerBlob,
40
40
  :pulp3_service_class => ::Katello::Pulp3::DockerBlob,
41
41
  :index => false
42
42
  end
@@ -19,7 +19,6 @@ Katello::RepositoryTypeManager.register(::Katello::Repository::FILE_TYPE) do
19
19
  repo_sync_url_class PulpFileClient::RepositorySyncURL
20
20
 
21
21
  content_type Katello::FileUnit,
22
- :pulp2_service_class => ::Katello::Pulp::FileUnit,
23
22
  :pulp3_service_class => ::Katello::Pulp3::FileUnit,
24
23
  :removable => true,
25
24
  :uploadable => true
@@ -21,12 +21,14 @@ Katello::RepositoryTypeManager.register('ostree') do
21
21
  url_description N_("URL of an OSTree repository.")
22
22
 
23
23
  generic_content_type 'ostree_ref',
24
+ pluralized_name: "OSTree Refs",
24
25
  model_class: Katello::GenericContentUnit,
25
26
  pulp3_api: PulpOstreeClient::ContentRefsApi,
26
27
  pulp3_service_class: Katello::Pulp3::GenericContentUnit,
27
28
  model_name: lambda { |pulp_unit| pulp_unit["name"] },
28
29
  model_version: lambda { |pulp_unit| pulp_unit["checksum"] },
29
30
  uploadable: true,
31
+ generic_browser: true,
30
32
  repository_import_on_upload: true
31
33
 
32
34
  import_attribute :ref, :content_type => 'ostree_ref',
@@ -48,4 +50,6 @@ Katello::RepositoryTypeManager.register('ostree') do
48
50
  :required => true
49
51
 
50
52
  default_managed_content_type :ostree_ref
53
+
54
+ test_url 'https://fixtures.pulpproject.org/ostree/small/'
51
55
  end
@@ -49,6 +49,10 @@ Katello::RepositoryTypeManager.register('python') do
49
49
  uploadable: true,
50
50
  duplicates_allowed: false,
51
51
  filename_key: :filename,
52
- generic_browser: true
52
+ generic_browser: true,
53
+ test_upload_path: 'test/fixtures/files/shelf_reader-0.1-py2-none-any.whl'
53
54
  default_managed_content_type :python_package
55
+
56
+ test_url 'https://fixtures.pulpproject.org/python-pypi/'
57
+ test_url_root_options generic_remote_options: {includes: ['celery']}.to_json
54
58
  end
@@ -21,35 +21,28 @@ Katello::RepositoryTypeManager.register(::Katello::Repository::YUM_TYPE) do
21
21
  default_managed_content_type Katello::Rpm::CONTENT_TYPE
22
22
  content_type Katello::Rpm,
23
23
  :priority => 1,
24
- :pulp2_service_class => ::Katello::Pulp::Rpm,
25
24
  :pulp3_service_class => ::Katello::Pulp3::Rpm,
26
25
  :primary_content => true,
27
26
  :removable => true,
28
27
  :uploadable => true
29
28
  content_type Katello::ModuleStream,
30
29
  :priority => 2,
31
- :pulp2_service_class => ::Katello::Pulp::ModuleStream,
32
30
  :pulp3_service_class => ::Katello::Pulp3::ModuleStream
33
31
  content_type Katello::Erratum, :priority => 3,
34
- :pulp2_service_class => ::Katello::Pulp::Erratum,
35
32
  :pulp3_service_class => ::Katello::Pulp3::Erratum,
36
- :primary_content => true
33
+ :primary_content => true, :mutable => true
37
34
  content_type Katello::PackageGroup,
38
- :pulp2_service_class => ::Katello::Pulp::PackageGroup,
39
35
  :pulp3_service_class => ::Katello::Pulp3::PackageGroup
40
36
  content_type Katello::YumMetadataFile,
41
- :pulp2_service_class => ::Katello::Pulp::YumMetadataFile,
42
37
  :pulp3_service_class => ::Katello::Pulp3::YumMetadataFile,
43
38
  :index_on_pulp3 => false
44
39
  content_type Katello::Srpm,
45
- :pulp2_service_class => ::Katello::Pulp::Srpm,
46
40
  :pulp3_service_class => ::Katello::Pulp3::Srpm,
47
41
  :removable => true, :uploadable => true
48
42
  content_type Katello::Distribution, :priority => 4,
49
- :pulp2_service_class => ::Katello::Pulp::Distribution,
50
43
  :pulp3_service_class => ::Katello::Pulp3::Distribution,
51
44
  :index => false
52
- content_type Katello::PackageCategory, :priority => 4, :pulp2_service_class => ::Katello::Pulp::PackageCategory, :index => false
45
+ content_type Katello::PackageCategory, :priority => 4, :index => false
53
46
 
54
47
  index_additional_data { |repo, target_repo = nil| repo.import_distribution_data(target_repo) }
55
48
  end
@@ -0,0 +1,34 @@
1
+ namespace :katello do
2
+ desc <<-DESCRIPTION
3
+ Marks a content view import only or otherwise. Only 'import_only' Content Views can import content via import/export process.
4
+ Options:
5
+ ID - ID of the content view that will be marked import
6
+ VALUE - If true the provided content view will be marked as import_only. This is the default.
7
+ If false the import_only flag of provided content view will be reset.
8
+ DESCRIPTION
9
+
10
+ task :set_content_view_import_only => ["environment"] do
11
+ def fetch_content_view
12
+ if ENV['ID'].blank?
13
+ fail 'Content view `ID` required.'
14
+ end
15
+ ::Katello::ContentView.find_by(id: ENV['ID'])
16
+ end
17
+
18
+ def mark_import_only(value: true)
19
+ User.current = User.anonymous_admin
20
+ content_view = fetch_content_view
21
+ fail('Composite content views cannot be marked import_only. Check the content view id.') if content_view.composite?
22
+ fail('Default Organization View cannot be marked import_only. Check the content view id.') if content_view.default?
23
+ content_view.import_only = value
24
+ if content_view.save(validate: false)
25
+ $stdout.print("Content View '#{content_view.name}'s import_only value updated to #{content_view.import_only} ")
26
+ else
27
+ $stderr.print("Unable to set the content view import_only to #{value}. Check the content view id.")
28
+ $stderr.print(content_view.errors.inspect)
29
+ end
30
+ end
31
+ value = ENV['VALUE'].blank? || ::Foreman::Cast.to_bool(ENV['VALUE'])
32
+ mark_import_only(value: value)
33
+ end
34
+ end
@@ -1,7 +1,7 @@
1
1
  namespace :katello do
2
2
  task :import_applicability => ["environment"] do
3
3
  Katello::Host::ContentFacet.find_each do |facet|
4
- facet.import_applicability
4
+ facet.calculate_and_import_applicability
5
5
  rescue StandardError => exception
6
6
  puts _('Error importing applicability for %{name} - %{id}: %{message}') %
7
7
  {:name => facet.host.name, :id => facet.host.id, :message => exception.message}
@@ -2,8 +2,6 @@ require File.expand_path("../engine", File.dirname(__FILE__))
2
2
 
3
3
  begin
4
4
  namespace :jenkins do
5
- ENV['USE_MEAN_TIME_REPORTER'] = '1' unless ENV['USE_MEAN_TIME_REPORTER'] == '0'
6
-
7
5
  task :katello do
8
6
  Rake::Task['jenkins:setup:minitest'].invoke
9
7
  Rake::Task['rake:test:katello'].invoke
@@ -119,7 +119,10 @@ namespace :katello do
119
119
  puts "Repository #{repo.id} Missing"
120
120
  if repo.content_view.default?
121
121
  puts "Recreating #{repo.id}"
122
- ForemanTasks.sync_task(::Actions::Katello::Repository::Create, repo, force_repo_create: true) if commit?
122
+ if commit?
123
+ ForemanTasks.sync_task(::Actions::Katello::Repository::Create, repo, force_repo_create: true)
124
+ repo.reload.index_content
125
+ end
123
126
  else
124
127
  puts "Deleting #{repo.id}"
125
128
  ForemanTasks.sync_task(::Actions::Katello::Repository::Destroy, repo) if commit?