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.
- checksums.yaml +4 -4
- data/app/assets/javascripts/katello/common/vendor.js +0 -1
- data/app/controllers/katello/api/v2/api_controller.rb +13 -4
- data/app/controllers/katello/api/v2/content_view_versions_controller.rb +3 -0
- data/app/controllers/katello/api/v2/content_views_controller.rb +46 -0
- data/app/controllers/katello/api/v2/host_packages_controller.rb +21 -1
- data/app/controllers/katello/api/v2/hosts_bulk_actions_controller.rb +30 -1
- data/app/controllers/katello/api/v2/organizations_controller.rb +10 -6
- data/app/controllers/katello/api/v2/packages_controller.rb +4 -0
- data/app/controllers/katello/api/v2/repositories_controller.rb +17 -7
- data/app/controllers/katello/api/v2/repository_sets_controller.rb +7 -0
- data/app/controllers/katello/concerns/api/v2/repository_content_controller.rb +3 -0
- data/app/controllers/katello/concerns/hosts_controller_extensions.rb +32 -0
- data/app/controllers/katello/remote_execution_controller.rb +5 -4
- data/app/helpers/katello/content_source_helper.rb +43 -0
- data/app/helpers/katello/hosts_and_hostgroups_helper.rb +4 -0
- data/app/lib/actions/katello/cdn_configuration/update.rb +5 -7
- data/app/lib/actions/katello/content_view/publish.rb +5 -0
- data/app/lib/actions/katello/content_view_version/incremental_update.rb +17 -3
- data/app/lib/actions/katello/repository/discover.rb +1 -14
- data/app/lib/actions/katello/repository/filtered_index_content.rb +1 -1
- data/app/lib/actions/pulp3/content_view_version/import.rb +7 -0
- data/app/lib/actions/pulp3/orchestration/content_view_version/import.rb +7 -5
- data/app/lib/actions/pulp3/repository/copy_content.rb +1 -1
- data/app/lib/actions/pulp3/repository/save_artifact.rb +1 -0
- data/app/lib/katello/concerns/base_template_scope_extensions.rb +11 -0
- data/app/lib/katello/errors.rb +3 -3
- data/app/lib/katello/logging.rb +6 -1
- data/app/lib/katello/repo_discovery.rb +27 -19
- data/app/lib/katello/resources/cdn/katello_cdn.rb +41 -3
- data/app/lib/katello/resources/cdn.rb +4 -2
- data/app/lib/katello/util/deduplication_migrator.rb +105 -0
- data/app/models/katello/candlepin/repository_mapper.rb +1 -1
- data/app/models/katello/cdn_configuration.rb +38 -6
- data/app/models/katello/concerns/host_managed_extensions.rb +23 -1
- data/app/models/katello/concerns/organization_extensions.rb +5 -1
- data/app/models/katello/concerns/pulp_database_unit.rb +59 -173
- data/app/models/katello/concerns/remote_execution_proxy_selector_extensions.rb +11 -0
- data/app/models/katello/concerns/smart_proxy_extensions.rb +1 -1
- data/app/models/katello/content_view.rb +4 -4
- data/app/models/katello/content_view_filter.rb +1 -1
- data/app/models/katello/content_view_history.rb +1 -1
- data/app/models/katello/content_view_version.rb +6 -2
- data/app/models/katello/content_view_version_export_history.rb +1 -1
- data/app/models/katello/deb.rb +1 -3
- data/app/models/katello/docker_meta_tag.rb +1 -1
- data/app/models/katello/erratum.rb +0 -15
- data/app/models/katello/glue/pulp/repos.rb +1 -1
- data/app/models/katello/host/content_facet.rb +2 -27
- data/app/models/katello/host/info_provider.rb +9 -0
- data/app/models/katello/host/subscription_facet.rb +2 -2
- data/app/models/katello/hostgroup/content_facet.rb +2 -2
- data/app/models/katello/product.rb +1 -1
- data/app/models/katello/product_content.rb +2 -2
- data/app/models/katello/repository.rb +10 -9
- data/app/models/katello/root_repository.rb +24 -13
- data/app/models/katello/rpm.rb +8 -2
- data/app/models/setting/content.rb +6 -3
- data/app/services/cert/rhsm_client.rb +1 -5
- data/app/services/katello/content_unit_indexer.rb +166 -0
- data/app/services/katello/organization_creator.rb +12 -4
- data/app/services/katello/pulp/repository/docker.rb +1 -1
- data/app/services/katello/pulp/repository/yum.rb +0 -54
- data/app/services/katello/pulp/repository.rb +0 -6
- data/app/services/katello/pulp3/ansible_collection.rb +26 -10
- data/app/services/katello/pulp3/api/apt.rb +7 -0
- data/app/services/katello/pulp3/content_view_version/import.rb +11 -2
- data/app/services/katello/pulp3/deb.rb +10 -9
- data/app/services/katello/pulp3/docker_manifest.rb +6 -5
- data/app/services/katello/pulp3/docker_manifest_list.rb +23 -6
- data/app/services/katello/pulp3/docker_tag.rb +16 -7
- data/app/services/katello/pulp3/erratum.rb +51 -56
- data/app/services/katello/pulp3/file_unit.rb +9 -6
- data/app/services/katello/pulp3/generic_content_unit.rb +11 -12
- data/app/services/katello/pulp3/module_stream.rb +76 -30
- data/app/services/katello/pulp3/package_group.rb +5 -5
- data/app/services/katello/pulp3/pulp_content_unit.rb +19 -11
- data/app/services/katello/pulp3/repository/apt.rb +5 -3
- data/app/services/katello/pulp3/repository/docker.rb +14 -7
- data/app/services/katello/pulp3/repository/generic.rb +1 -1
- data/app/services/katello/pulp3/repository/yum.rb +10 -12
- data/app/services/katello/pulp3/repository.rb +26 -7
- data/app/services/katello/pulp3/repository_mirror.rb +18 -5
- data/app/services/katello/pulp3/rpm.rb +13 -13
- data/app/services/katello/pulp3/srpm.rb +10 -9
- data/app/services/katello/repository_type.rb +15 -4
- data/app/services/katello/repository_type_manager.rb +1 -1
- data/app/services/katello/ui_notifications/subscriptions/manifest_expired_warning.rb +1 -1
- data/app/services/katello/upstream_connection_checker.rb +2 -2
- data/app/views/foreman/job_templates/change_content_source.erb +1 -31
- data/app/views/foreman/job_templates/install_errata.erb +6 -9
- data/app/views/foreman/job_templates/install_errata_by_search_query.erb +26 -0
- data/app/views/foreman/job_templates/install_packages_by_search_query.erb +19 -0
- data/app/views/katello/api/v2/cdn_configurations/show.json.rabl +1 -1
- data/app/views/katello/api/v2/environments/show.json.rabl +9 -0
- data/app/views/katello/api/v2/repositories/show.json.rabl +2 -0
- data/app/views/katello/layouts/react.html.erb +0 -1
- data/app/views/katello/sync_management/_repo.html.erb +36 -25
- data/config/initializers/monkeys.rb +0 -1
- data/config/routes/api/v2.rb +1 -0
- data/config/routes/overrides.rb +3 -0
- data/config/routes.rb +2 -0
- data/db/migrate/20150930183738_migrate_content_hosts.rb +1 -1
- data/db/migrate/20180612164926_add_content_org_id.rb +2 -2
- data/db/migrate/20211201154845_add_unique_indexes.rb +20 -0
- data/db/migrate/20211208034230_add_content_view_and_lifecycle_environment.rb +6 -0
- data/db/migrate/20211220185935_clean_duplicate_content_units.rb +144 -0
- data/db/migrate/20220110223754_update_disconnected_settings.rb +20 -0
- data/db/migrate/20220120163252_fix_docker_download_policy.rb +11 -0
- data/db/migrate/20220124191056_add_type_to_cdn_configuration.rb +22 -0
- data/db/migrate/20220127120843_fix_debian_download_policy.rb +11 -0
- data/db/migrate/20220204171908_rename_docker_tags_whitelist_and_add_exclude_tags.rb +8 -0
- data/db/migrate/20220207140355_change_deb_attributes_size_limit.rb +7 -0
- data/db/seeds.d/111-upgrade_tasks.rb +2 -1
- data/engines/bastion/app/views/bastion/layouts/application.html.erb +0 -1
- data/engines/bastion/app/views/bastion/layouts/assets.html.erb +0 -1
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/content-credentials.controller.js +1 -1
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/details/content-credential-products.controller.js +1 -1
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/details/content-credential-repositories.controller.js +1 -1
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/bulk/views/content-hosts-bulk-traces-modal.html +1 -1
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/details/views/environment.html +26 -1
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/bastion_katello.pot +212 -152
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/packages/packages.controller.js +1 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details-info.controller.js +20 -8
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details-manage-content.controller.js +2 -3
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details.controller.js +8 -3
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-info.html +34 -30
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/new-repository.controller.js +16 -2
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/views/new-repository.html +35 -15
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/discovery/discovery.controller.js +5 -4
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/products.routes.js +4 -3
- data/lib/katello/engine.rb +4 -0
- data/lib/katello/permission_creator.rb +1 -1
- data/lib/katello/permissions/host_permissions.rb +3 -1
- data/lib/katello/plugin.rb +4 -1
- data/lib/katello/repository_types/deb.rb +0 -1
- data/lib/katello/repository_types/docker.rb +4 -4
- data/lib/katello/repository_types/file.rb +0 -1
- data/lib/katello/repository_types/ostree.rb +4 -0
- data/lib/katello/repository_types/python.rb +5 -1
- data/lib/katello/repository_types/yum.rb +2 -9
- data/lib/katello/tasks/content_view_import_only.rake +34 -0
- data/lib/katello/tasks/import_applicability.rake +1 -1
- data/lib/katello/tasks/jenkins.rake +0 -2
- data/lib/katello/tasks/repository.rake +4 -1
- data/lib/katello/tasks/upgrades/4.4/publish_import_cvvs.rake +17 -0
- data/lib/katello/version.rb +1 -1
- data/locale/action_names.rb +8 -7
- data/locale/bn/katello.po +1402 -650
- data/locale/cs/katello.po +1217 -96
- data/locale/de/katello.po +2359 -1347
- data/locale/en/katello.po +1216 -94
- data/locale/es/katello.po +2201 -1172
- data/locale/fr/katello.po +2601 -1615
- data/locale/gu/katello.po +1564 -814
- data/locale/hi/katello.po +1563 -810
- data/locale/it/katello.po +1311 -282
- data/locale/ja/katello.po +2534 -1518
- data/locale/katello.pot +3430 -1326
- data/locale/kn/katello.po +1564 -812
- data/locale/ko/katello.po +1441 -409
- data/locale/mr/katello.po +1564 -776
- data/locale/or/katello.po +1565 -813
- data/locale/pa/katello.po +1559 -792
- data/locale/pt/katello.po +1314 -277
- data/locale/pt_BR/katello.po +2226 -1181
- data/locale/ru/katello.po +1587 -563
- data/locale/ta/katello.po +1373 -619
- data/locale/te/katello.po +1564 -810
- data/locale/zh_CN/katello.po +2936 -1890
- data/locale/zh_TW/katello.po +1508 -606
- data/webpack/__mocks__/foremanReact/{redux/actions/toasts.js → components/ToastsList/index.js} +3 -2
- data/webpack/components/ActionableDetail.js +35 -21
- data/webpack/components/Content/Details/__tests__/ContentDetailInfo.test.js +0 -2
- data/webpack/components/Content/Details/__tests__/ContentDetailRepositories.test.js +0 -2
- data/webpack/components/Content/Details/__tests__/ContentDetails.test.js +0 -2
- data/webpack/components/Content/__tests__/ContentPage.test.js +0 -2
- data/webpack/components/Content/__tests__/ContentTable.test.js +0 -2
- data/webpack/components/EditableSwitch.js +8 -2
- data/webpack/components/EditableTextInput/EditableTextInput.js +44 -86
- data/webpack/components/EditableTextInput/__tests__/editableTextInput.test.js +3 -3
- data/webpack/components/Errata/index.js +19 -11
- data/webpack/components/Packages/index.js +1 -1
- data/webpack/components/Search/Search.js +5 -2
- data/webpack/components/Search/__tests__/search.test.js +2 -3
- data/webpack/components/SelectOrg/SetOrganization.js +1 -1
- data/webpack/components/Table/PageControls.js +3 -6
- data/webpack/components/Table/TableHooks.js +46 -7
- data/webpack/components/Table/TableWrapper.js +14 -3
- data/webpack/components/TypeAhead/TypeAhead.js +5 -1
- data/webpack/components/TypeAhead/pf4Search/TypeAheadInput.js +4 -1
- data/webpack/components/TypeAhead/pf4Search/TypeAheadSearch.js +2 -1
- data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard.js +1 -1
- data/webpack/components/extensions/HostDetails/Cards/ErrataOverviewCard.js +3 -4
- data/webpack/components/extensions/HostDetails/HostDetailsActions.js +2 -0
- data/webpack/components/extensions/HostDetails/HostPackages/HostPackagesActions.js +18 -2
- data/webpack/components/extensions/HostDetails/HostPackages/HostPackagesConstants.js +12 -0
- data/webpack/components/extensions/HostDetails/Tabs/ContentTab/SecondaryTabsRoutes.js +1 -1
- data/webpack/components/extensions/HostDetails/Tabs/{ErrataTab.js → ErrataTab/ErrataTab.js} +30 -21
- data/webpack/components/extensions/HostDetails/Tabs/{ErrataTab.scss → ErrataTab/ErrataTab.scss} +0 -0
- data/webpack/components/extensions/HostDetails/Tabs/{ErratumExpansionContents.js → ErrataTab/ErratumExpansionContents.js} +0 -0
- data/webpack/components/extensions/HostDetails/Tabs/{ErratumExpansionDetail.js → ErrataTab/ErratumExpansionDetail.js} +0 -0
- data/webpack/components/extensions/HostDetails/{HostErrata → Tabs/ErrataTab}/HostErrataActions.js +3 -3
- data/webpack/components/extensions/HostDetails/{HostErrata → Tabs/ErrataTab}/HostErrataConstants.js +11 -0
- data/webpack/components/extensions/HostDetails/{HostErrata → Tabs/ErrataTab}/HostErrataSelectors.js +0 -0
- data/webpack/components/extensions/HostDetails/Tabs/PackageInstallModal.js +279 -0
- data/webpack/components/extensions/HostDetails/Tabs/PackageInstallModal.scss +3 -0
- data/webpack/components/extensions/HostDetails/Tabs/PackagesTab.js +125 -8
- data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionActions.js +27 -4
- data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionConstants.js +2 -1
- data/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsTab.js +6 -3
- data/webpack/components/extensions/HostDetails/Tabs/{EnableTracerEmptyState.js → TracesTab/EnableTracerEmptyState.js} +0 -0
- data/webpack/components/extensions/HostDetails/Tabs/{EnableTracerModal.js → TracesTab/EnableTracerModal.js} +3 -2
- data/webpack/components/extensions/HostDetails/Tabs/{HostTracesActions.js → TracesTab/HostTracesActions.js} +2 -2
- data/webpack/components/extensions/HostDetails/Tabs/{HostTracesConstants.js → TracesTab/HostTracesConstants.js} +0 -0
- data/webpack/components/extensions/HostDetails/Tabs/{HostTracesSelectors.js → TracesTab/HostTracesSelectors.js} +0 -0
- data/webpack/components/extensions/HostDetails/Tabs/{TracesTab.js → TracesTab/TracesTab.js} +8 -5
- data/webpack/components/extensions/HostDetails/Tabs/{TracesTab.scss → TracesTab/TracesTab.scss} +0 -0
- data/webpack/components/extensions/HostDetails/Tabs/__tests__/errataTab.test.js +17 -18
- data/webpack/components/extensions/HostDetails/Tabs/__tests__/packageInstallModal.test.js +385 -0
- data/webpack/components/extensions/HostDetails/Tabs/__tests__/packages.fixtures.json +1 -1
- data/webpack/components/extensions/HostDetails/Tabs/__tests__/packagesTab.test.js +58 -7
- data/webpack/components/extensions/HostDetails/Tabs/__tests__/repositorySetsTab.test.js +2 -2
- data/webpack/components/extensions/HostDetails/Tabs/__tests__/tracesTab.test.js +4 -4
- data/webpack/components/extensions/HostDetails/Tabs/__tests__/yumInstallablePackages.fixtures.json +72 -0
- data/webpack/components/extensions/HostDetails/Tabs/customizedRexUrlHelpers.js +12 -5
- data/webpack/components/extensions/HostDetails/YumInstallablePackages/YumInstallablePackagesActions.js +18 -0
- data/webpack/components/extensions/HostDetails/YumInstallablePackages/YumInstallablePackagesConstants.js +3 -0
- data/webpack/components/extensions/HostDetails/YumInstallablePackages/YumInstallablePackagesSelectors.js +16 -0
- data/webpack/components/extensions/HostDetails/hostDetailsHelpers.js +19 -0
- data/webpack/components/pf3Table/components/Table.js +2 -3
- data/webpack/components/pf3Table/components/Table.test.js +0 -3
- data/webpack/components/pf3Table/components/__snapshots__/Table.test.js.snap +9 -8
- data/webpack/containers/Application/config.js +5 -0
- data/webpack/global_index.js +1 -1
- data/webpack/global_test_setup.js +1 -1
- data/webpack/index.js +7 -0
- data/webpack/scenes/AnsibleCollections/Details/__tests__/AnsibleCollectionDetails.test.js +0 -2
- data/webpack/scenes/AnsibleCollections/__tests__/AnsibleCollectionPage.test.js +0 -2
- data/webpack/scenes/AnsibleCollections/__tests__/AnsibleCollectionsTable.test.js +0 -2
- data/webpack/scenes/Content/ContentConfig.js +55 -5
- data/webpack/scenes/Content/ContentPage.js +1 -1
- data/webpack/scenes/Content/Details/ContentDetails.js +1 -1
- data/webpack/scenes/Content/Details/ContentInfo.js +1 -1
- data/webpack/scenes/Content/Details/ContentRepositories.js +1 -1
- data/webpack/scenes/Content/Details/__tests__/contentDetail.test.js +4 -4
- data/webpack/scenes/Content/Table/ContentTable.js +1 -1
- data/webpack/scenes/Content/__tests__/contentTable.test.js +3 -3
- data/webpack/scenes/ContentViews/ContentViewsConstants.js +2 -1
- data/webpack/scenes/ContentViews/Delete/__tests__/contentViewDelete.test.js +6 -6
- data/webpack/scenes/ContentViews/Details/ComponentContentViews/__tests__/contentViewComponents.test.js +2 -2
- data/webpack/scenes/ContentViews/Details/ContentViewDetailActions.js +21 -27
- data/webpack/scenes/ContentViews/Details/ContentViewDetailSelectors.js +5 -5
- data/webpack/scenes/ContentViews/Details/ContentViewInfo.js +8 -3
- data/webpack/scenes/ContentViews/Details/DetailsContainer.js +11 -16
- data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilterDetails.js +2 -2
- data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilterDetailsHeader.js +14 -8
- data/webpack/scenes/ContentViews/Details/Filters/MatchContentModal/__tests__/CVRpmMatchContentModal.test.js +2 -2
- data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVContainerImageFilterContent.test.js +2 -3
- data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVRpmFilterContent.test.js +2 -9
- data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilterDetails.test.js +3 -5
- data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilters.test.js +2 -10
- data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvErrataIDFilter.test.js +2 -3
- data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvModuleStreamFilter.test.js +2 -3
- data/webpack/scenes/ContentViews/Details/Histories/__tests__/contentViewHistory.test.js +2 -2
- data/webpack/scenes/ContentViews/Details/Repositories/ContentCounts.js +1 -1
- data/webpack/scenes/ContentViews/Details/Repositories/ContentViewRepositories.js +23 -2
- data/webpack/scenes/ContentViews/Details/Repositories/__tests__/contentViewAddRemove.test.js +11 -5
- data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersionContent.js +16 -17
- data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersions.js +1 -1
- data/webpack/scenes/ContentViews/Details/Versions/Delete/__tests__/cvVersionRemove.test.js +6 -6
- data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailConfig.js +30 -34
- data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetails.js +9 -8
- data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailsHeader.js +13 -15
- data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionRepositoryCell.js +1 -1
- data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetails.test.js +4 -4
- data/webpack/scenes/ContentViews/Details/Versions/__tests__/contentViewVersions.test.js +3 -3
- data/webpack/scenes/ContentViews/Details/__tests__/contentViewDetail.test.js +5 -3
- data/webpack/scenes/ContentViews/__tests__/contentViewPage.test.js +2 -2
- data/webpack/scenes/Hosts/ChangeContentSource/actions.js +43 -0
- data/webpack/scenes/Hosts/ChangeContentSource/components/ContentSourceForm.js +87 -0
- data/webpack/scenes/Hosts/ChangeContentSource/components/ContentSourceTemplate.js +90 -0
- data/webpack/scenes/Hosts/ChangeContentSource/components/FormField.js +43 -0
- data/webpack/scenes/Hosts/ChangeContentSource/constants.js +3 -0
- data/webpack/scenes/Hosts/ChangeContentSource/helpers.js +27 -0
- data/webpack/scenes/Hosts/ChangeContentSource/index.js +126 -0
- data/webpack/scenes/Hosts/ChangeContentSource/selectors.js +42 -0
- data/webpack/scenes/Hosts/ChangeContentSource/styles.scss +11 -0
- data/webpack/scenes/ModuleStreams/Details/Profiles/__tests__/ModuleStreamDetailProfiles.test.js +0 -1
- data/webpack/scenes/ModuleStreams/Details/__tests__/ModuleStreamDetails.test.js +0 -2
- data/webpack/scenes/ModuleStreams/__tests__/ModuleStreamPage.test.js +0 -2
- data/webpack/scenes/ModuleStreams/__tests__/ModuleStreamsTable.test.js +0 -2
- data/webpack/scenes/Organizations/OrganizationActions.js +5 -1
- data/webpack/scenes/RedHatRepositories/RedHatRepositoriesPage.js +31 -1
- data/webpack/scenes/RedHatRepositories/__tests__/RedHatRepositoriesPage.test.js +16 -0
- data/webpack/scenes/RedHatRepositories/__tests__/__snapshots__/RedHatRepositoriesPage.test.js.snap +11 -2
- data/webpack/scenes/RedHatRepositories/helpers.js +5 -5
- data/webpack/scenes/RedHatRepositories/index.js +11 -3
- data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/AirGappedTypeForm.js +81 -0
- data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/CdnConfigurationConstants.js +13 -0
- data/webpack/scenes/Subscriptions/Manifest/{CdnConfigurationForm.scss → CdnConfigurationTab/CdnConfigurationForm.scss} +0 -0
- data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/CdnTypeForm.js +106 -0
- data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/UpstreamServerTypeForm.js +259 -0
- data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/__tests__/AirGappedTypeForm.test.js +44 -0
- data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/__tests__/CdnTypeForm.test.js +67 -0
- data/webpack/scenes/Subscriptions/Manifest/{__tests__/CdnConfigurationForm.test.js → CdnConfigurationTab/__tests__/UpstreamServerTypeForm.test.js} +46 -17
- data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/index.js +97 -0
- data/webpack/scenes/Subscriptions/Manifest/ManageManifestModal.js +6 -1
- data/webpack/scenes/Subscriptions/UpstreamSubscriptions/__tests__/UpstreamSubscriptionsPage.test.js +0 -1
- data/webpack/scenes/Subscriptions/__tests__/SubscriptionsPage.test.js +0 -1
- data/webpack/scenes/Subscriptions/__tests__/__snapshots__/SubscriptionsActions.test.js.snap +3 -2
- data/webpack/scenes/Subscriptions/components/SubscriptionsTable/__tests__/SubscriptionsTable.test.js +4 -0
- data/webpack/scenes/Subscriptions/components/SubscriptionsTable/__tests__/__snapshots__/SubscriptionsTable.test.js.snap +9 -0
- data/webpack/scenes/Tasks/TaskActions.js +1 -1
- data/webpack/scenes/Tasks/__tests__/__snapshots__/TaskActions.test.js.snap +3 -2
- data/webpack/services/api/testHelpers.js +5 -3
- data/webpack/utils/helpers.js +6 -3
- metadata +81 -58
- data/app/services/katello/pulp/deb.rb +0 -55
- data/app/services/katello/pulp/distribution.rb +0 -7
- data/app/services/katello/pulp/docker_blob.rb +0 -7
- data/app/services/katello/pulp/docker_manifest.rb +0 -13
- data/app/services/katello/pulp/docker_manifest_list.rb +0 -14
- data/app/services/katello/pulp/docker_tag.rb +0 -14
- data/app/services/katello/pulp/erratum.rb +0 -129
- data/app/services/katello/pulp/file_unit.rb +0 -21
- data/app/services/katello/pulp/module_stream.rb +0 -39
- data/app/services/katello/pulp/package_category.rb +0 -7
- data/app/services/katello/pulp/package_group.rb +0 -20
- data/app/services/katello/pulp/pulp_content_unit.rb +0 -156
- data/app/services/katello/pulp/rpm.rb +0 -57
- data/app/services/katello/pulp/srpm.rb +0 -29
- data/app/services/katello/pulp/yum_metadata_file.rb +0 -30
- data/lib/monkeys/pulp3_13_checksumfix.rb +0 -17
- data/webpack/__mocks__/foremanReact/components/Pagination/PaginationHooks.js +0 -2
- data/webpack/__mocks__/foremanReact/components/Pagination/PaginationWrapper.js +0 -2
- data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationForm.js +0 -185
@@ -4,6 +4,8 @@ module Katello
|
|
4
4
|
audited :except => [:content_id]
|
5
5
|
serialize :ignorable_content
|
6
6
|
serialize :docker_tags_whitelist
|
7
|
+
serialize :include_tags
|
8
|
+
serialize :exclude_tags
|
7
9
|
serialize :os_versions
|
8
10
|
|
9
11
|
include Ext::LabelFromName
|
@@ -21,7 +23,7 @@ module Katello
|
|
21
23
|
SUBSCRIBABLE_TYPES = [Repository::YUM_TYPE, Repository::OSTREE_TYPE, Repository::DEB_TYPE].freeze
|
22
24
|
|
23
25
|
CONTENT_ATTRIBUTE_RESTRICTIONS = {
|
24
|
-
:download_policy => [Repository::YUM_TYPE, Repository::DEB_TYPE]
|
26
|
+
:download_policy => [Repository::YUM_TYPE, Repository::DEB_TYPE, Repository::DOCKER_TYPE]
|
25
27
|
}.freeze
|
26
28
|
|
27
29
|
NO_DEFAULT_HTTP_PROXY = 'none'.freeze
|
@@ -54,7 +56,7 @@ module Katello
|
|
54
56
|
has_many :repositories, :class_name => "Katello::Repository", :foreign_key => :root_id,
|
55
57
|
:inverse_of => :root, :dependent => :destroy
|
56
58
|
|
57
|
-
has_many :repository_references, :class_name => 'Katello::Pulp3::RepositoryReference',
|
59
|
+
has_many :repository_references, :class_name => 'Katello::Pulp3::RepositoryReference',
|
58
60
|
:dependent => :destroy, :inverse_of => :root_repository
|
59
61
|
|
60
62
|
validates_lengths_from_database :except => [:label]
|
@@ -72,7 +74,8 @@ module Katello
|
|
72
74
|
validate :ensure_valid_collection_attributes, :if => :ansible_collection?
|
73
75
|
validate :ensure_valid_auth_url_token, :if => :ansible_collection?
|
74
76
|
validate :ensure_valid_ignorable_content
|
75
|
-
validate :
|
77
|
+
validate :ensure_valid_include_tags
|
78
|
+
validate :ensure_valid_exclude_tags
|
76
79
|
validate :ensure_valid_os_versions
|
77
80
|
validate :ensure_content_attribute_restrictions
|
78
81
|
validate :ensure_valid_upstream_authorization
|
@@ -223,10 +226,17 @@ module Katello
|
|
223
226
|
end
|
224
227
|
end
|
225
228
|
|
226
|
-
def
|
227
|
-
return if
|
228
|
-
unless
|
229
|
-
errors.add(:
|
229
|
+
def ensure_valid_include_tags
|
230
|
+
return if include_tags.blank?
|
231
|
+
unless include_tags.is_a?(Array)
|
232
|
+
errors.add(:include_tags, N_("Invalid value specified for Container Image repositories."))
|
233
|
+
end
|
234
|
+
end
|
235
|
+
|
236
|
+
def ensure_valid_exclude_tags
|
237
|
+
return if exclude_tags.blank?
|
238
|
+
unless exclude_tags.is_a?(Array)
|
239
|
+
errors.add(:exclude_tags, N_("Invalid value specified for Container Image repositories."))
|
230
240
|
end
|
231
241
|
end
|
232
242
|
|
@@ -315,6 +325,11 @@ module Katello
|
|
315
325
|
Katello::Content.find_by(:cp_content_id => self.content_id, :organization_id => self.product.organization_id)
|
316
326
|
end
|
317
327
|
|
328
|
+
# For API support during deprecation period.
|
329
|
+
def docker_tags_whitelist
|
330
|
+
include_tags
|
331
|
+
end
|
332
|
+
|
318
333
|
def docker?
|
319
334
|
self.content_type == Repository::DOCKER_TYPE
|
320
335
|
end
|
@@ -359,7 +374,7 @@ module Katello
|
|
359
374
|
changeable_attributes = %w(url unprotected checksum_type docker_upstream_name download_policy mirroring_policy verify_ssl_on_sync
|
360
375
|
upstream_username upstream_password ignorable_content
|
361
376
|
ssl_ca_cert_id ssl_client_cert_id ssl_client_key_id http_proxy_policy http_proxy_id download_concurrency)
|
362
|
-
changeable_attributes += %w(name container_repository_name
|
377
|
+
changeable_attributes += %w(name container_repository_name include_tags exclude_tags) if docker?
|
363
378
|
changeable_attributes += %w(deb_releases deb_components deb_architectures gpg_key_id) if deb?
|
364
379
|
changeable_attributes += %w(ansible_collection_requirements ansible_collection_auth_url ansible_collection_auth_token) if ansible_collection?
|
365
380
|
changeable_attributes.any? { |key| previous_changes.key?(key) }
|
@@ -396,11 +411,7 @@ module Katello
|
|
396
411
|
|
397
412
|
def format_arches
|
398
413
|
if content_type == ::Katello::Repository::DEB_TYPE
|
399
|
-
|
400
|
-
# subscription-manager PR https://github.com/candlepin/subscription-manager/pull/2213
|
401
|
-
# merged. Otherwise subscription-manager returns _NO_ debian repository as described in
|
402
|
-
# https://community.theforeman.org/t/katello-3-16-1-1-el7-subscription-manager-doesnt-create-rhsm-repos-for-ubuntu/20928/38
|
403
|
-
nil
|
414
|
+
self.deb_architectures
|
404
415
|
else
|
405
416
|
self.arch == "noarch" ? nil : self.arch
|
406
417
|
end
|
data/app/models/katello/rpm.rb
CHANGED
@@ -8,6 +8,7 @@ module Katello
|
|
8
8
|
has_many :content_facets, :through => :content_facet_applicable_rpms, :class_name => "Katello::Host::ContentFacet"
|
9
9
|
has_many :module_stream_rpms, class_name: "Katello::ModuleStreamRpm", inverse_of: :rpm, dependent: :destroy
|
10
10
|
has_many :module_streams, :through => :module_stream_rpms
|
11
|
+
scoped_search :on => :id, :complete_value => true
|
11
12
|
scoped_search :on => :name, :complete_value => true
|
12
13
|
scoped_search :on => :version, :complete_value => true, :ext_method => :scoped_search_version
|
13
14
|
scoped_search :on => :release, :complete_value => true, :ext_method => :scoped_search_release
|
@@ -19,8 +20,6 @@ module Katello
|
|
19
20
|
scoped_search :on => :modular, :complete_value => true, :only_explicit => true
|
20
21
|
scoped_search :on => :checksum
|
21
22
|
|
22
|
-
before_save lambda { |rpm| rpm.summary = rpm.summary.truncate(255) unless rpm.summary.blank? }
|
23
|
-
|
24
23
|
scope :modular, -> { where(modular: true) }
|
25
24
|
scope :non_modular, -> { where(modular: false) }
|
26
25
|
|
@@ -215,6 +214,13 @@ module Katello
|
|
215
214
|
where("#{Katello::Host::ContentFacet.table_name}.host_id" => hosts).distinct
|
216
215
|
end
|
217
216
|
|
217
|
+
# Return RPMs that are not installed on a host, but could be installed
|
218
|
+
# the word 'installable' has a different meaning here than elsewhere
|
219
|
+
def self.yum_installable_for_host(host)
|
220
|
+
repos = host.content_facet.bound_repositories.pluck(:id)
|
221
|
+
Katello::Rpm.in_repositories(repos).where.not(name: host.installed_packages.pluck(:name)).order(:name)
|
222
|
+
end
|
223
|
+
|
218
224
|
def self.latest(relation)
|
219
225
|
# There are several different ways to implement this:
|
220
226
|
|
@@ -75,8 +75,8 @@ class Setting::Content < Setting
|
|
75
75
|
20, N_('Accept action timeout')),
|
76
76
|
self.set('content_action_finish_timeout', N_("Time in seconds to wait for a Host to finish a remote action"),
|
77
77
|
3600, N_('Finish action timeout')),
|
78
|
-
self.set('
|
79
|
-
|
78
|
+
self.set('subscription_connection_enabled', N_("Can communicate with the Red Hat Portal for subscriptions."),
|
79
|
+
true, N_('Subscription connection enabled')),
|
80
80
|
self.set('errata_status_installable', N_("Calculate errata host status based only on errata in a Host's Content View and Lifecycle Environment"),
|
81
81
|
false, N_('Installable errata from Content View')),
|
82
82
|
self.set('restrict_composite_view', N_("If this is enabled, a composite content view may not be published or "\
|
@@ -88,6 +88,7 @@ class Setting::Content < Setting
|
|
88
88
|
100, N_('Batch size to sync repositories in.')),
|
89
89
|
self.set('foreman_proxy_content_auto_sync', N_("Whether or not to auto sync the Smart Proxies after a Content View promotion."),
|
90
90
|
true, N_('Sync Smart Proxies after Content View promotion')),
|
91
|
+
self.set('download_rate_limit', N_("Maximum download rate when syncing a repository (requests per second). Use 0 for no limit."), 0, N_("Download rate limit")),
|
91
92
|
self.set('default_download_policy', N_("Default download policy for custom repositories (either 'immediate' or 'on_demand')"), "immediate",
|
92
93
|
N_('Default Custom Repository download policy'), nil, :collection => download_policies),
|
93
94
|
self.set('default_redhat_download_policy', N_("Default download policy for enabled Red Hat repositories (either 'immediate' or 'on_demand')"), "on_demand",
|
@@ -148,7 +149,9 @@ class Setting::Content < Setting
|
|
148
149
|
N_('Pulp bulk load size')),
|
149
150
|
self.set('upload_profiles_without_dynflow', N_('Allow Katello to update host installed packages, enabled repos, and module inventory directly instead of wrapped in Dynflow tasks (try turning off if Puma processes are using too much memory)'), true,
|
150
151
|
N_('Upload profiles without Dynflow')),
|
151
|
-
self.set('orphan_protection_time', N_('Time in minutes to consider orphan content as orphaned.'), 1440, N_('Orphaned Content Protection Time'))
|
152
|
+
self.set('orphan_protection_time', N_('Time in minutes to consider orphan content as orphaned.'), 1440, N_('Orphaned Content Protection Time')),
|
153
|
+
self.set('remote_execution_prefer_registered_through_proxy', N_('Prefer using a proxy to which a host is registered when using remote execution'), false,
|
154
|
+
N_('Prefer registered through proxy for remote execution'))
|
152
155
|
]
|
153
156
|
end
|
154
157
|
|
@@ -10,7 +10,7 @@ module Cert
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def uuid
|
13
|
-
|
13
|
+
@uuid ||= @cert.subject.to_a.detect { |name, _, _| name == 'CN' }&.second
|
14
14
|
end
|
15
15
|
|
16
16
|
private
|
@@ -26,10 +26,6 @@ module Cert
|
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
|
-
def drop_cn_prefix_from_subject(subject_string)
|
30
|
-
subject_string.sub(/\/CN=/i, '')
|
31
|
-
end
|
32
|
-
|
33
29
|
def strip_cert(cert)
|
34
30
|
cert = cert.to_s.gsub("-----BEGIN CERTIFICATE-----", "").gsub("-----END CERTIFICATE-----", "")
|
35
31
|
cert.delete!(' ')
|
@@ -0,0 +1,166 @@
|
|
1
|
+
module Katello
|
2
|
+
class ContentUnitIndexer
|
3
|
+
def initialize(content_type:, repository: nil, pulp_content_ids: nil, optimized: true)
|
4
|
+
@content_type = content_type
|
5
|
+
@model_class = content_type.model_class
|
6
|
+
@service_class = SmartProxy.pulp_primary!.content_service(content_type)
|
7
|
+
@repository = repository
|
8
|
+
@content_type = content_type
|
9
|
+
@pulp_content_ids = pulp_content_ids
|
10
|
+
@optimized = optimized
|
11
|
+
end
|
12
|
+
|
13
|
+
def remove_duplicates(unit)
|
14
|
+
#when we are uploading units, we need to remove any duplicates from our indexed data
|
15
|
+
if @content_type.label == 'rpm' && @repository && @pulp_content_ids
|
16
|
+
rpms_to_disassociate = ::Katello::Rpm.where(name: unit[:name], version: unit[:version], release: unit[:release],
|
17
|
+
epoch: unit[:epoch], arch: unit[:arch]).select(:id)
|
18
|
+
if rpms_to_disassociate.any?
|
19
|
+
::Katello::RepositoryRpm.where(rpm_id: rpms_to_disassociate, repository_id: @repository.id).destroy_all
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def import_all
|
25
|
+
association_tracker = RepoAssociationTracker.new(@content_type, @service_class, @repository)
|
26
|
+
|
27
|
+
units_from_pulp.each do |units|
|
28
|
+
units.each do |unit|
|
29
|
+
association_tracker.push(unit)
|
30
|
+
remove_duplicates(unit)
|
31
|
+
end
|
32
|
+
|
33
|
+
unless fetch_only_ids
|
34
|
+
to_insert = units.map do |unit|
|
35
|
+
if @content_type.generic?
|
36
|
+
@service_class.generate_model_row(unit, @content_type)
|
37
|
+
else
|
38
|
+
@service_class.generate_model_row(unit)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
next if to_insert.empty?
|
43
|
+
insert_timestamps(to_insert)
|
44
|
+
if @content_type.mutable
|
45
|
+
@model_class.upsert_all(to_insert, unique_by: :pulp_id)
|
46
|
+
else
|
47
|
+
@model_class.insert_all(to_insert, unique_by: :pulp_id)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
import_associations(units) if @repository
|
52
|
+
end
|
53
|
+
|
54
|
+
if @model_class.many_repository_associations && @repository
|
55
|
+
sync_repository_associations(association_tracker)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def import_associations(units)
|
60
|
+
pulp_id_to_id = self.class.pulp_id_to_id_map(@content_type, units.map { |unit| unit[@service_class.unit_identifier] })
|
61
|
+
@service_class.insert_child_associations(units, pulp_id_to_id) if @service_class.respond_to?(:insert_child_associations)
|
62
|
+
end
|
63
|
+
|
64
|
+
def units_from_pulp(&block)
|
65
|
+
if @pulp_content_ids
|
66
|
+
@service_class.pulp_units_batch_all(@pulp_content_ids, &block)
|
67
|
+
elsif @repository
|
68
|
+
@service_class.pulp_units_batch_for_repo(@repository, fetch_identifiers: fetch_only_ids, content_type: @content_type, &block)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def self.pulp_id_to_id_map(content_type, pulp_ids)
|
73
|
+
map = {}
|
74
|
+
content_type.model_class.with_pulp_id(pulp_ids).select(:id, :pulp_id).each do |model|
|
75
|
+
map[model.pulp_id] = model.id
|
76
|
+
end
|
77
|
+
map
|
78
|
+
end
|
79
|
+
|
80
|
+
class RepoAssociationTracker
|
81
|
+
def initialize(content_type, service_class, repository)
|
82
|
+
@values = {}
|
83
|
+
@content_type = content_type
|
84
|
+
@repository = repository
|
85
|
+
@service_class = service_class
|
86
|
+
end
|
87
|
+
|
88
|
+
def unit_ids
|
89
|
+
db_values.map { |row| row[@content_type.model_class.unit_id_field] }
|
90
|
+
end
|
91
|
+
|
92
|
+
#pulp_href is only provided if we're storing a different 'pulp_id' on the repo association
|
93
|
+
def push(unit)
|
94
|
+
if @service_class.backend_unit_identifier
|
95
|
+
pulp_href = unit.dig(@service_class.backend_unit_identifier)
|
96
|
+
else
|
97
|
+
pulp_href = nil
|
98
|
+
end
|
99
|
+
unit_id = unit[@service_class.unit_identifier]
|
100
|
+
@values[unit_id] = pulp_href
|
101
|
+
end
|
102
|
+
|
103
|
+
def db_values
|
104
|
+
return @final_values if @final_values
|
105
|
+
@final_value = []
|
106
|
+
|
107
|
+
@final_values = ::Katello::ContentUnitIndexer.pulp_id_to_id_map(@content_type, @values.keys).map do |pulp_id, katello_id|
|
108
|
+
#:repository_id => X, :erratum_id => y
|
109
|
+
row = {:repository_id => @repository.id, @content_type.model_class.unit_id_field => katello_id}
|
110
|
+
row[pulp_href_association_name] = @values[pulp_id] if pulp_href_association_name
|
111
|
+
row
|
112
|
+
end
|
113
|
+
ContentUnitIndexer.insert_timestamps(@content_type.model_class, @final_values)
|
114
|
+
@final_values
|
115
|
+
end
|
116
|
+
|
117
|
+
def pulp_href_association_name
|
118
|
+
'erratum_pulp3_href' if @content_type.label == 'erratum'
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
def insert_timestamps(units)
|
123
|
+
self.class.insert_timestamps(@model_class, units)
|
124
|
+
end
|
125
|
+
|
126
|
+
def self.insert_timestamps(model_class, units)
|
127
|
+
dates = model_class.columns.map(&:name).include?("created_at")
|
128
|
+
return units unless dates
|
129
|
+
units.each do |row|
|
130
|
+
row[:created_at] = DateTime.now
|
131
|
+
row[:updated_at] = DateTime.now
|
132
|
+
end
|
133
|
+
units
|
134
|
+
end
|
135
|
+
|
136
|
+
def fetch_only_ids
|
137
|
+
@optimized && @repository &&
|
138
|
+
!@repository.content_view.default? &&
|
139
|
+
!@repository.repository_type.unique_content_per_repo &&
|
140
|
+
@service_class.supports_id_fetch?
|
141
|
+
end
|
142
|
+
|
143
|
+
def sync_repository_associations(assocication_tracker, additive: false)
|
144
|
+
unless additive
|
145
|
+
ActiveRecord::Base.connection.uncached do
|
146
|
+
@model_class.repository_association_class.where(repository_id: @repository.id).where.
|
147
|
+
not(@model_class.unit_id_field => assocication_tracker.unit_ids).delete_all
|
148
|
+
end
|
149
|
+
end
|
150
|
+
return if assocication_tracker.db_values.empty?
|
151
|
+
@model_class.repository_association_class.upsert_all(assocication_tracker.db_values, :unique_by => association_class_uniqiness_attributes)
|
152
|
+
end
|
153
|
+
|
154
|
+
def association_class_uniqiness_attributes
|
155
|
+
columns = [@model_class.unit_id_field, 'repository_id']
|
156
|
+
found = ActiveRecord::Base.connection.indexes(@model_class.repository_association_class.table_name).find do |index|
|
157
|
+
index.columns.sort == columns.sort
|
158
|
+
end
|
159
|
+
if found
|
160
|
+
found.columns
|
161
|
+
else
|
162
|
+
fail "Unable to find unique index for #{columns} on table #{self.repository_association_class.table_name}"
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
@@ -1,5 +1,11 @@
|
|
1
1
|
module Katello
|
2
2
|
class OrganizationCreator
|
3
|
+
DEFAULT_CONTENT_VIEW_NAME = 'Default Organization View'.freeze
|
4
|
+
DEFAULT_CONTENT_VIEW_LABEL = 'Default_Organization_View'.freeze
|
5
|
+
|
6
|
+
DEFAULT_LIFECYCLE_ENV_NAME = 'Library'.freeze
|
7
|
+
DEFAULT_LIFECYCLE_ENV_LABEL = 'Library'.freeze
|
8
|
+
|
3
9
|
attr_reader :library_view, :library_environment, :library_cvv, :content_view_environment, :anonymous_provider, :redhat_provider
|
4
10
|
|
5
11
|
def self.seed_all_organizations!
|
@@ -87,8 +93,8 @@ module Katello
|
|
87
93
|
|
88
94
|
def create_library_environment
|
89
95
|
@library_environment = Katello::KTEnvironment.where(
|
90
|
-
:name =>
|
91
|
-
:label =>
|
96
|
+
:name => DEFAULT_LIFECYCLE_ENV_NAME,
|
97
|
+
:label => DEFAULT_LIFECYCLE_ENV_LABEL,
|
92
98
|
:library => true,
|
93
99
|
:organization => @organization
|
94
100
|
).first_or_create!
|
@@ -97,7 +103,8 @@ module Katello
|
|
97
103
|
def create_library_view
|
98
104
|
@library_view = Katello::ContentView.where(
|
99
105
|
default: true,
|
100
|
-
name:
|
106
|
+
name: DEFAULT_CONTENT_VIEW_NAME,
|
107
|
+
label: DEFAULT_CONTENT_VIEW_LABEL,
|
101
108
|
organization: @organization
|
102
109
|
).first_or_create!
|
103
110
|
end
|
@@ -128,7 +135,8 @@ module Katello
|
|
128
135
|
def create_cdn_configuration
|
129
136
|
@cdn_configuration = Katello::CdnConfiguration.where(
|
130
137
|
organization: @organization,
|
131
|
-
url: ::Katello::Resources::CDN::CdnResource.redhat_cdn_url
|
138
|
+
url: ::Katello::Resources::CDN::CdnResource.redhat_cdn_url,
|
139
|
+
type: ::Katello::CdnConfiguration::CDN_TYPE
|
132
140
|
).first_or_create!
|
133
141
|
end
|
134
142
|
end
|
@@ -105,37 +105,6 @@ module Katello
|
|
105
105
|
config
|
106
106
|
end
|
107
107
|
|
108
|
-
def copy_contents(destination_repo, filters: nil,
|
109
|
-
solve_dependencies: false,
|
110
|
-
rpm_filenames: [])
|
111
|
-
rpm_copy_clauses, rpm_remove_clauses = generate_copy_clauses(filters&.yum(false), rpm_filenames)
|
112
|
-
tasks = []
|
113
|
-
if rpm_copy_clauses
|
114
|
-
override_config = build_override_config(destination_repo,
|
115
|
-
filters: filters,
|
116
|
-
solve_dependencies: solve_dependencies)
|
117
|
-
|
118
|
-
tasks << smart_proxy.pulp_api.extensions.rpm.copy(repo.pulp_id, destination_repo.pulp_id,
|
119
|
-
rpm_copy_clauses.merge(:override_config => override_config))
|
120
|
-
end
|
121
|
-
|
122
|
-
if rpm_remove_clauses
|
123
|
-
tasks << smart_proxy.pulp_api.extensions.repository.unassociate_units(destination_repo.pulp_id,
|
124
|
-
type_ids: [::Katello::Pulp::Rpm::CONTENT_TYPE],
|
125
|
-
filters: {unit: rpm_remove_clauses})
|
126
|
-
end
|
127
|
-
|
128
|
-
tasks.concat(copy_module_contents(destination_repo,
|
129
|
-
filters: filters,
|
130
|
-
solve_dependencies: solve_dependencies))
|
131
|
-
|
132
|
-
[:srpm, :errata, :package_group, :package_environment,
|
133
|
-
:yum_repo_metadata_file, :distribution, :module_default, :drpm].each do |type|
|
134
|
-
tasks << smart_proxy.pulp_api.extensions.send(type).copy(repo.pulp_id, destination_repo.pulp_id)
|
135
|
-
end
|
136
|
-
tasks
|
137
|
-
end
|
138
|
-
|
139
108
|
def import_distribution_data
|
140
109
|
distribution = smart_proxy.pulp_api.extensions.repository.distributions(repo.pulp_id).first
|
141
110
|
if distribution
|
@@ -230,29 +199,6 @@ module Katello
|
|
230
199
|
end
|
231
200
|
[copy_clauses, remove_clauses]
|
232
201
|
end
|
233
|
-
|
234
|
-
def generate_copy_clauses(filters, rpm_filenames)
|
235
|
-
if rpm_filenames&.any?
|
236
|
-
copy_clauses = {filters: {unit: { 'filename' => { '$in' => rpm_filenames } }}}
|
237
|
-
remove_clauses = nil
|
238
|
-
elsif filters&.any?
|
239
|
-
clause_gen = ::Katello::Util::PackageClauseGenerator.new(repo, filters.yum(false))
|
240
|
-
clause_gen.generate
|
241
|
-
|
242
|
-
copy = clause_gen.copy_clause
|
243
|
-
copy_clauses = {filters: {unit: copy }} if copy
|
244
|
-
|
245
|
-
remove = clause_gen.remove_clause
|
246
|
-
remove_clauses = {filters: {unit: remove}} if remove
|
247
|
-
else
|
248
|
-
non_modular_rpms = ::Katello::Rpm.in_repositories(repo).non_modular.pluck(:filename)
|
249
|
-
copy_clauses = non_modular_rpms.blank? ? nil : {filters: {unit: ContentViewPackageFilter.generate_rpm_clauses(non_modular_rpms)}}
|
250
|
-
remove_clauses = nil
|
251
|
-
end
|
252
|
-
|
253
|
-
copy_clauses&.merge!(fields: ::Katello::Pulp::Rpm::PULP_SELECT_FIELDS)
|
254
|
-
[copy_clauses, remove_clauses]
|
255
|
-
end
|
256
202
|
end
|
257
203
|
end
|
258
204
|
end
|
@@ -278,12 +278,6 @@ module Katello
|
|
278
278
|
Katello::RepositoryTypeManager.find(repo.content_type)
|
279
279
|
end
|
280
280
|
|
281
|
-
def index_content_units
|
282
|
-
content_unit_types.each do |content_type|
|
283
|
-
content_type.pulp2_service_class
|
284
|
-
end
|
285
|
-
end
|
286
|
-
|
287
281
|
def proxy_options
|
288
282
|
if repo.root.http_proxy_policy == RootRepository::NO_DEFAULT_HTTP_PROXY
|
289
283
|
return { proxy_host: '' }
|
@@ -18,17 +18,33 @@ module Katello
|
|
18
18
|
fail NotImplementedError
|
19
19
|
end
|
20
20
|
|
21
|
-
def
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
21
|
+
def self.generate_model_row(unit)
|
22
|
+
{
|
23
|
+
pulp_id: unit['pulp_href'],
|
24
|
+
checksum: unit['sha256'],
|
25
|
+
namespace: unit['namespace'],
|
26
|
+
version: unit['version'],
|
27
|
+
name: unit['name'],
|
28
|
+
description: unit['description']
|
29
|
+
}
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.insert_child_associations(units, pulp_id_to_id)
|
33
|
+
tag_names = units.map { |unit| unit['tags'].map { |tag| tag[:name] } }.flatten
|
34
|
+
tag_rows = tag_names.map { |name| {name: name } }
|
35
|
+
Katello::AnsibleTag.insert_all(tag_rows, unique_by: [:name]) if tag_rows.any?
|
36
|
+
|
37
|
+
collection_tag_rows = []
|
38
|
+
units.each do |unit|
|
39
|
+
katello_id = pulp_id_to_id[unit['pulp_href']]
|
40
|
+
#delete old tags
|
41
|
+
unit_tags = unit['tags'].map { |tag| tag[:name] }
|
42
|
+
Katello::AnsibleCollectionTag.where(:ansible_collection_id => katello_id).where.not(:ansible_tag_id => Katello::AnsibleTag.where(:name => unit_tags)).delete_all
|
43
|
+
collection_tag_rows += Katello::AnsibleTag.where(:name => unit_tags).pluck(:id).map { |tag_id| {ansible_collection_id: katello_id, ansible_tag_id: tag_id} }
|
44
|
+
end
|
29
45
|
|
30
|
-
|
31
|
-
|
46
|
+
collection_tag_rows.flatten!
|
47
|
+
Katello::AnsibleCollectionTag.insert_all(collection_tag_rows, unique_by: [:ansible_collection_id, :ansible_tag_id])
|
32
48
|
end
|
33
49
|
end
|
34
50
|
end
|
@@ -4,6 +4,13 @@ module Katello
|
|
4
4
|
module Pulp3
|
5
5
|
module Api
|
6
6
|
class Apt < Core
|
7
|
+
def publication_verbatim_class
|
8
|
+
PulpDebClient::DebVerbatimPublication
|
9
|
+
end
|
10
|
+
|
11
|
+
def publications_verbatim_api
|
12
|
+
PulpDebClient::PublicationsVerbatimApi.new(api_client)
|
13
|
+
end
|
7
14
|
end
|
8
15
|
end
|
9
16
|
end
|
@@ -121,11 +121,20 @@ module Katello
|
|
121
121
|
}
|
122
122
|
end
|
123
123
|
|
124
|
+
fail _("Content View label not provided.") if metadata[:label].blank?
|
125
|
+
|
124
126
|
cv = ::Katello::ContentView.find_by(label: metadata[:label],
|
125
|
-
organization: organization
|
126
|
-
import_only: true)
|
127
|
+
organization: organization)
|
127
128
|
if cv.blank?
|
128
129
|
::Katello::ContentView.create!(metadata.merge(organization: organization, import_only: true))
|
130
|
+
elsif !cv.import_only?
|
131
|
+
msg = _("Unable to import in to Content View specified in the metadata - '%{name}'. "\
|
132
|
+
"The 'import_only' attribute for the content view is set to false. "\
|
133
|
+
"To mark this Content View as importable, have your system administrator"\
|
134
|
+
" run the following command on the server. "\
|
135
|
+
% { name: cv.name })
|
136
|
+
command = "foreman-rake katello:set_content_view_import_only ID=#{cv.id}"
|
137
|
+
fail msg + "\n" + command
|
129
138
|
else
|
130
139
|
cv.update!(description: cv_metadata[:description]) if cv.description != metadata[:description]
|
131
140
|
cv
|
@@ -23,15 +23,16 @@ module Katello
|
|
23
23
|
repo_content_list.map { |content| content.try(:pulp_href) }
|
24
24
|
end
|
25
25
|
|
26
|
-
def
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
26
|
+
def self.generate_model_row(unit)
|
27
|
+
{
|
28
|
+
pulp_id: unit[unit_identifier],
|
29
|
+
checksum: unit[:sha256],
|
30
|
+
filename: unit[:relative_path],
|
31
|
+
name: unit[:package],
|
32
|
+
version: unit[:version],
|
33
|
+
description: unit[:description]&.truncate(255),
|
34
|
+
architecture: unit[:architecture]
|
35
|
+
}
|
35
36
|
end
|
36
37
|
end
|
37
38
|
end
|
@@ -20,11 +20,12 @@ module Katello
|
|
20
20
|
self.content_api.list(page_opts)
|
21
21
|
end
|
22
22
|
|
23
|
-
def
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
23
|
+
def self.generate_model_row(unit)
|
24
|
+
{
|
25
|
+
schema_version: unit['schema_version'],
|
26
|
+
digest: unit['digest'],
|
27
|
+
pulp_id: unit[unit_identifier]
|
28
|
+
}
|
28
29
|
end
|
29
30
|
end
|
30
31
|
end
|
@@ -18,12 +18,29 @@ module Katello
|
|
18
18
|
self.content_api.list(page_opts)
|
19
19
|
end
|
20
20
|
|
21
|
-
def
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
21
|
+
def self.generate_model_row(unit)
|
22
|
+
{
|
23
|
+
schema_version: unit['schema_version'],
|
24
|
+
digest: unit['digest'],
|
25
|
+
pulp_id: unit[unit_identifier]
|
26
|
+
}
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.insert_child_associations(units, pulp_id_to_id)
|
30
|
+
manifest_list_manifests = []
|
31
|
+
units.each do |unit|
|
32
|
+
katello_id = pulp_id_to_id[unit[unit_identifier]]
|
33
|
+
manifest_ids = ::Katello::DockerManifest.where(:pulp_id => unit[:listed_manifests]).pluck(:id)
|
34
|
+
manifest_list_manifests += manifest_ids.map do |manifest_id|
|
35
|
+
{
|
36
|
+
docker_manifest_list_id: katello_id,
|
37
|
+
docker_manifest_id: manifest_id
|
38
|
+
}
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
manifest_list_manifests.flatten!
|
43
|
+
Katello::DockerManifestListManifest.insert_all(manifest_list_manifests, unique_by: [:docker_manifest_list_id, :docker_manifest_id]) if manifest_list_manifests.any?
|
27
44
|
end
|
28
45
|
end
|
29
46
|
end
|