def test_positive_multi_level_filters(self):
        """Verify promotion of Content View and Verify count after applying
        multi_filters (errata and module stream)

        :id: aeaf2ac7-eda2-4f07-a1dd-fe6057934697

        :expectedresults: Verify module stream and errata count should correct

        :CaseLevel: Integration
        """
        # apply include errata filter
        cv_filter = entities.ErratumContentViewFilter(
            content_view=self.content_view, inclusion=True).create()
        errata = entities.Errata().search(
            query={'search': f'errata_id="{FAKE_0_MODULAR_ERRATA_ID}"'})[0]
        entities.ContentViewFilterRule(content_view_filter=cv_filter,
                                       errata=errata).create()

        # apply exclude module filter
        cv_filter = entities.ModuleStreamContentViewFilter(
            content_view=self.content_view, inclusion=False).create()
        module_streams = entities.ModuleStream().search(
            query={'search': 'name="{}"'.format('walrus')})
        entities.ContentViewFilterRule(content_view_filter=cv_filter,
                                       module_stream=module_streams).create()
        self.content_view.publish()
        content_view = self.content_view.read()
        content_view_version_info = content_view.read().version[0].read()
        # verify the module_stream_count and errata_count for Include Filter
        assert content_view_version_info.module_stream_count == 2
        assert content_view_version_info.errata_counts['total'] == 1
    def test_positive_include_exclude_module_stream_filter(
            self, content_view_module_stream):
        """Verify Include and Exclude Errata filter(modular errata) automatically force the copy
           of the module streams associated to it.

        :id: 20540722-b163-4ebb-b18d-351444ef0c86

        :steps:
            1. Create Include Errata filter
            2. Publish content view, Verify errata and stream count.
            3. Delete Filter (As we can not update the filter inclusion type)
            4. Create Exclude Errata filter
            5. Publish content view, Verify errata and stream count

        :expectedresults: Module Stream count changes automatically after including or
            excluding modular errata

        :CaseLevel: Integration
        """
        content_view = content_view_module_stream
        cv_filter = entities.ErratumContentViewFilter(
            content_view=content_view,
            inclusion=True,
        ).create()
        errata = entities.Errata().search(query={
            'search':
            f'errata_id="{settings.repos.module_stream_0.errata[2]}"'
        })[0]
        entities.ContentViewFilterRule(content_view_filter=cv_filter,
                                       errata=errata).create()

        content_view.publish()
        content_view = content_view.read()
        content_view_version_info = content_view.version[0].read()

        # verify the module_stream_count and errata_count for Exclude Filter
        assert content_view_version_info.module_stream_count == 2
        assert content_view_version_info.errata_counts['total'] == 1

        # delete the previous content_view_filter
        cv_filter.delete()
        cv_filter = entities.ErratumContentViewFilter(
            content_view=content_view,
            inclusion=False,
        ).create()
        errata = entities.Errata().search(query={
            'search':
            f'errata_id="{settings.repos.module_stream_0.errata[2]}"'
        })[0]
        entities.ContentViewFilterRule(content_view_filter=cv_filter,
                                       errata=errata).create()

        content_view.publish()
        content_view_version_info = content_view.read().version[1].read()

        # verify the module_stream_count and errata_count for Include Filter
        assert content_view_version_info.module_stream_count == 5
        assert content_view_version_info.errata_counts['total'] == 5
    def test_positive_dependency_solving_module_stream_filter(self):
        """Verify Module Stream Content View Filter's with Dependency Solve 'Yes'.
        If dependency solving enabled then dependent module streams will be fetched
        over even if the exclude filter has been applied.
        e.g. duck module stream is dependent on kangaroo stream, hence even if add only
        exclude filter on kangaroo it will get ignored as it is fetched because of duck
        module stream. but if both duck and kangaroo module streams are in exclude filter
        both will not get fetched.

        :id: ea8a4d95-dc36-4102-b1a9-d53beaf14352

        :expectedresults: Verify dependant/non dependant module streams are getting fetched.

        :CaseLevel: Integration
        """
        self.content_view.solve_dependencies = True
        content_view = self.content_view.update(['solve_dependencies'])
        cv_filter = entities.ModuleStreamContentViewFilter(
            content_view=content_view, inclusion=False).create()
        module_streams = entities.ModuleStream().search(
            query={
                'search':
                'name="{}" and version="{}'.format('kangaroo',
                                                   '20180730223407')
            })
        entities.ContentViewFilterRule(content_view_filter=cv_filter,
                                       module_stream=module_streams).create()
        self.content_view.publish()
        content_view = content_view.read()
        content_view_version_info = content_view.read().version[0].read()

        # Total Module Stream Count = 7, Exclude filter rule get ignored.
        assert content_view_version_info.module_stream_count == 7
    def test_positive_publish_with_content_view_filter_and_swid_tags(
        self, module_org, module_product
    ):
        """Verify SWID tags content file should exist in publish content view
        version location even after applying content view filters.

        :id: 00ac640f-1dfc-4083-8405-5164650d71b5

        :steps:
            1. create product and repository with custom contents having swid tags
            2. sync the repository
            3. create the content view
            4. create content view filter
            5. apply content view filter to repository
            6. publish the content-view
            7. ssh into Satellite
            8. verify SWID tags content file exist in publish content view version location

        :expectedresults: SWID tags content file should exist in publish content view
            version location

        :CaseAutomation: Automated

        :CaseImportance: Critical

        :CaseLevel: Integration
        """
        swid_tag_repository = entities.Repository(
            product=module_product, url=CUSTOM_SWID_TAG_REPO
        ).create()
        swid_tag_repository.sync()
        content_view = entities.ContentView(organization=module_org).create()
        content_view.repository = [swid_tag_repository]
        content_view.update(['repository'])

        cv_filter = entities.RPMContentViewFilter(
            content_view=content_view,
            inclusion=True,
            repository=[swid_tag_repository],
        ).create()
        assert len(cv_filter.repository) == 1
        cv_filter_rule = entities.ContentViewFilterRule(
            content_view_filter=cv_filter, name='walrus', version='1.0'
        ).create()
        assert cv_filter.id == cv_filter_rule.content_view_filter.id
        content_view.publish()
        content_view = content_view.read()
        content_view_version_info = content_view.version[0].read()
        assert len(content_view.repository) == 1
        assert len(content_view.version) == 1
        swid_repo_path = "{}/{}/content_views/{}/{}/custom/{}/{}/repodata".format(
            CUSTOM_REPODATA_PATH,
            module_org.name,
            content_view.name,
            content_view_version_info.version,
            module_product.name,
            swid_tag_repository.name,
        )
        result = ssh.command(f'ls {swid_repo_path} | grep swidtags.xml.gz')
        assert result.return_code == 0
    def test_positive_add_rh_custom_spin(self):
        """Associate Red Hat content in a view and filter it using rule

        @Feature: Content Views

        @Assert: Filtered RH content is available and can be seen in a
        view
        """
        content_view = entities.ContentView(organization=self.org).create()
        content_view.repository = [self.repo]
        content_view = content_view.update(['repository'])
        self.assertEqual(len(content_view.repository), 1)

        # content_view ← cv_filter
        cv_filter = entities.RPMContentViewFilter(
            content_view=content_view,
            inclusion='true',
            name=gen_string('alphanumeric'),
        ).create()
        self.assertEqual(content_view.id, cv_filter.content_view.id)

        # content_view ← cv_filter ← cv_filter_rule
        cv_filter_rule = entities.ContentViewFilterRule(
            content_view_filter=cv_filter,
            name=gen_string('alphanumeric'),
            version='1.0',
        ).create()
        self.assertEqual(cv_filter.id, cv_filter_rule.content_view_filter.id)
示例#6
0
    def test_positive_search_package_group(self):
        """Search for an package group content view filter's rules.

        @Assert: The search completes with no errors.

        @Feature: Content View Filter
        """
        cv_filter = entities.PackageGroupContentViewFilter(
            content_view=self.content_view).create()
        entities.ContentViewFilterRule(content_view_filter=cv_filter).search()
示例#7
0
    def test_positive_search_rpm(self):
        """Search for an rpm content view filter's rules.

        @Assert: The search completes with no errors.

        @Feature: Content View Filter
        """
        cv_filter = entities.RPMContentViewFilter(
            content_view=self.content_view).create()
        entities.ContentViewFilterRule(content_view_filter=cv_filter).search()
示例#8
0
    def test_positive_search_package_group(self):
        """Search for an package group content view filter's rules.

        @id: 832c50cc-c2c8-48c9-9a23-80956baf5f3c

        @Assert: The search completes with no errors.
        """
        cv_filter = entities.PackageGroupContentViewFilter(
            content_view=self.content_view
        ).create()
        entities.ContentViewFilterRule(content_view_filter=cv_filter).search()
示例#9
0
    def test_positive_search_rpm(self):
        """Search for an rpm content view filter's rules.

        @id: 1c9058f1-35c4-46f2-9b21-155ef988564a

        @Assert: The search completes with no errors.
        """
        cv_filter = entities.RPMContentViewFilter(
            content_view=self.content_view
        ).create()
        entities.ContentViewFilterRule(content_view_filter=cv_filter).search()
示例#10
0
    def test_positive_search_erratum(self):
        """Search for an erratum content view filter's rules.

        @id: 6a86060f-6b4f-4688-8ea9-c198e0aeb3f6

        @Assert: The search completes with no errors.
        """
        cv_filter = entities.ErratumContentViewFilter(
            content_view=self.content_view
        ).create()
        entities.ContentViewFilterRule(content_view_filter=cv_filter).search()
示例#11
0
    def test_positive_search_rpm(self, content_view):
        """Search for an rpm content view filter's rules.

        :id: 1c9058f1-35c4-46f2-9b21-155ef988564a

        :expectedresults: The search completes with no errors.

        :CaseImportance: Critical
        """
        cv_filter = entities.RPMContentViewFilter(content_view=content_view).create()
        entities.ContentViewFilterRule(content_view_filter=cv_filter).search()
示例#12
0
    def test_positive_search_package_group(self, content_view):
        """Search for an package group content view filter's rules.

        :id: 832c50cc-c2c8-48c9-9a23-80956baf5f3c

        :expectedresults: The search completes with no errors.

        :CaseImportance: Critical
        """
        cv_filter = entities.PackageGroupContentViewFilter(content_view=content_view).create()
        entities.ContentViewFilterRule(content_view_filter=cv_filter).search()
    def test_positive_search_erratum(self):
        """Search for an erratum content view filter's rules.

        :id: 6a86060f-6b4f-4688-8ea9-c198e0aeb3f6

        :expectedresults: The search completes with no errors.

        :CaseImportance: Critical
        """
        cv_filter = entities.ErratumContentViewFilter(
            content_view=self.content_view).create()
        entities.ContentViewFilterRule(content_view_filter=cv_filter).search()
示例#14
0
    def test_positive_promote_module_stream_filter(self, module_org, content_view_module_stream):
        """Verify Module Stream, Errata Count after Promote, Publish for Content View
        with Module Stream Exclude Filter

        :id: 2f5d21b1-8cbc-4a77-b8a2-09aa466f56a3

        :expectedresults: Content View should get published and promoted successfully
            with correct Module Stream count.

        :CaseLevel: Integration
        """
        # Exclude module stream filter
        content_view = content_view_module_stream
        cv_filter = entities.ModuleStreamContentViewFilter(
            content_view=content_view,
            inclusion=False,
        ).create()
        module_streams = entities.ModuleStream().search(
            query={'search': 'name="{}"'.format('duck')}
        )
        entities.ContentViewFilterRule(
            content_view_filter=cv_filter, module_stream=module_streams
        ).create()
        content_view.publish()
        content_view = content_view.read()
        content_view_version_info = content_view.version[0].read()
        assert len(content_view.repository) == 1
        assert len(content_view.version) == 1

        # the module stream and errata count based in filter after publish
        assert content_view_version_info.module_stream_count == 4
        assert content_view_version_info.errata_counts['total'] == 3

        # Promote Content View
        lce = entities.LifecycleEnvironment(organization=module_org).create()
        promote(content_view.version[0], lce.id)
        content_view = content_view.read()
        content_view_version_info = content_view.version[0].read()

        # assert the module stream and errata count based in filter after promote
        assert content_view_version_info.module_stream_count == 4
        assert content_view_version_info.errata_counts['total'] == 3
示例#15
0
def apply_package_filter(content_view, repo, package, inclusion=True):
    """ Apply package filter on content view

    :param content_view: entity content view
    :param repo: entity repository
    :param str package: package name to filter
    :param bool inclusion: True/False based on include or exclude filter

    :return list : list of content view versions
    """
    cv_filter = entities.RPMContentViewFilter(content_view=content_view,
                                              inclusion=inclusion,
                                              repository=[repo]).create()
    cv_filter_rule = entities.ContentViewFilterRule(
        content_view_filter=cv_filter, name=package).create()
    assert cv_filter.id == cv_filter_rule.content_view_filter.id
    content_view.publish()
    content_view = content_view.read()
    content_view_version_info = content_view.version[0].read()
    return content_view_version_info
示例#16
0
    def test_positive_create_date_filter_rule_without_type(self):
        """Create content view erratum filter rule with start/end date and
        without type specified via API and make sure it's accessible via UI

        :id: 5a5cd6e7-8711-47c2-878d-4c0a18bf3b0e

        :BZ: 1386688

        :CaseImportance: Critical

        :expectedresults: filter rule is accessible via UI, type is set to all
            possible errata types and all the rest fields are correctly
            populated
        """
        start_date = date.today().strftime('%Y-%m-%d')
        end_date = (date.today() + timedelta(days=5)).strftime('%Y-%m-%d')
        # default date type on UI is 'updated', so we'll use different one
        date_type = FILTER_ERRATA_DATE['issued']
        content_view = entities.ContentView(
            organization=self.organization).create()
        cvf = entities.ErratumContentViewFilter(
            content_view=content_view).create()
        cvfr = entities.ContentViewFilterRule(
            end_date=end_date,
            content_view_filter=cvf,
            date_type=date_type,
            start_date=start_date,
        ).create()
        self.assertEqual(set(cvfr.types), set(FILTER_ERRATA_TYPE.values()))
        with Session(self) as session:
            session.nav.go_to_select_org(self.organization.name)
            result = self.content_views.fetch_erratum_date_range_filter_values(
                content_view.name, cvf.name)
            self.assertEqual(set(result['types']),
                             set(FILTER_ERRATA_TYPE.values()))
            self.assertEqual(result['date_type'], date_type)
            self.assertEqual(result['start_date'], start_date)
            self.assertEqual(result['end_date'], end_date)
示例#17
0
def test_positive_filtered_errata_status_installable_param(
        session, errata_status_installable):
    """Filter errata for specific content view and verify that host that
    was registered using that content view has different states in
    correspondence to filtered errata and `errata status installable`
    settings flag value

    :id: ed94cf34-b8b9-4411-8edc-5e210ea6af4f

    :Steps:

        1. Prepare setup: Create Lifecycle Environment, Content View,
            Activation Key and all necessary repos
        2. Register Content Host using created data
        3. Create necessary Content View Filter and Rule for repository errata
        4. Publish and Promote Content View to a new version.
        5. Go to created Host page and check its properties
        6. Change 'errata status installable' flag in the settings and
            check host properties once more

    :expectedresults: Check that 'errata status installable' flag works as intended

    :BZ: 1368254

    :CaseLevel: System
    """
    org = entities.Organization().create()
    lce = entities.LifecycleEnvironment(organization=org).create()
    repos_collection = RepositoryCollection(
        distro=DISTRO_RHEL7,
        repositories=[
            SatelliteToolsRepository(),
            # As Satellite Tools may be added as custom repo and to have a "Fully entitled" host,
            # force the host to consume an RH product with adding a cdn repo.
            RHELAnsibleEngineRepository(cdn=True),
            YumRepository(url=CUSTOM_REPO_URL),
        ],
    )
    repos_collection.setup_content(org.id, lce.id, upload_manifest=True)
    with VirtualMachine(distro=repos_collection.distro) as client:
        repos_collection.setup_virtual_machine(client)
        assert _install_client_package(client,
                                       FAKE_1_CUSTOM_PACKAGE,
                                       errata_applicability=True)
        # Adding content view filter and content view filter rule to exclude errata for the
        # installed package.
        content_view = entities.ContentView(
            id=repos_collection.setup_content_data['content_view']
            ['id']).read()
        cv_filter = entities.ErratumContentViewFilter(
            content_view=content_view, inclusion=False).create()
        errata = entities.Errata(
            content_view_version=content_view.version[-1]).search(query=dict(
                search=f'errata_id="{CUSTOM_REPO_ERRATA_ID}"'))[0]
        entities.ContentViewFilterRule(content_view_filter=cv_filter,
                                       errata=errata).create()
        content_view.publish()
        content_view = content_view.read()
        content_view_version = content_view.version[-1]
        promote(content_view_version, lce.id)
        with session:
            session.organization.select(org_name=org.name)
            _set_setting_value(errata_status_installable, True)
            expected_values = {
                'Status': 'OK',
                'Errata': 'All errata applied',
                'Subscription': 'Fully entitled',
            }
            host_details_values = session.host.get_details(client.hostname)
            actual_values = {
                key: value
                for key, value in host_details_values['properties']
                ['properties_table'].items() if key in expected_values
            }
            for key in actual_values:
                assert expected_values[key] in actual_values[
                    key], 'Expected text not found'
            _set_setting_value(errata_status_installable, False)
            expected_values = {
                'Status': 'Error',
                'Errata': 'Security errata applicable',
                'Subscription': 'Fully entitled',
            }
            # navigate to host main page by making a search, to refresh the host details page
            session.host.search(client.hostname)
            host_details_values = session.host.get_details(client.hostname)
            actual_values = {
                key: value
                for key, value in host_details_values['properties']
                ['properties_table'].items() if key in expected_values
            }
            for key in actual_values:
                assert expected_values[key] in actual_values[
                    key], 'Expected text not found'
示例#18
0
    def setUp(self):
        """Creates the pre-requisites for the Incremental updates that used per
        each test"""
        super(IncrementalUpdateTestCase, self).setUp()
        # Create content view that will be used filtered erratas
        self.rhel_6_partial_cv = entities.ContentView(
            organization=self.org,
            name=gen_alpha(),
            repository=[self.rhva_6_repo, self.rhel6_sat6tools_repo]).create()

        # Create a content view filter to filter out errata
        rhel_6_partial_cvf = entities.ErratumContentViewFilter(
            content_view=self.rhel_6_partial_cv,
            type='erratum',
            name='rhel_6_partial_cv_filter',
            repository=[self.rhva_6_repo]).create()

        # Create a content view filter rule - filtering out errata in the last
        # 365 days
        start_date = (date.today() - timedelta(days=365)).strftime('%Y-%m-%d')
        entities.ContentViewFilterRule(
            content_view_filter=rhel_6_partial_cvf,
            types=['security', 'enhancement', 'bugfix'],
            start_date=start_date,
            end_date=date.today().strftime('%Y-%m-%d')).create()

        # Publish content view and re-read it

        self.rhel_6_partial_cv.publish()
        self.rhel_6_partial_cv = self.rhel_6_partial_cv.read()

        # Promote content view to 'DEV' and 'QE'
        assert len(self.rhel_6_partial_cv.version) == 1
        for env in (self.dev_lce, self.qe_lce):
            promote(self.rhel_6_partial_cv.version[0], env.id)

        # Create host collection
        self.rhel_6_partial_hc = entities.HostCollection(organization=self.org,
                                                         name=gen_alpha(),
                                                         max_hosts=5).create()

        # Create activation key for content view
        kwargs = {'organization': self.org, 'environment': self.qe_lce.id}
        rhel_6_partial_ak = entities.ActivationKey(
            name=gen_alpha(),
            content_view=self.rhel_6_partial_cv,
            host_collection=[self.rhel_6_partial_hc],
            **kwargs).create()

        # Assign subscription to activation key. Fetch available subscriptions
        subs = entities.Subscription(organization=self.org).search()
        assert len(subs) > 0

        # Add subscription to activation key
        sub_found = False
        for sub in subs:
            if sub.read_json()['product_name'] == DEFAULT_SUBSCRIPTION_NAME:
                rhel_6_partial_ak.add_subscriptions(
                    data={u'subscription_id': sub.id})
                sub_found = True
        assert sub_found

        # Enable product content in activation key
        rhel_6_partial_ak.content_override(
            data={
                'content_override': {
                    u'content_label': REPOS['rhst6']['id'],
                    u'value': u'1'
                }
            })

        # Create client machine and register it to satellite with
        # rhel_6_partial_ak
        self.vm = VirtualMachine(distro=DISTRO_RHEL6, tag='incupdate')
        self.addCleanup(vm_cleanup, self.vm)
        self.setup_vm(self.vm, rhel_6_partial_ak.name, self.org.label)
        self.vm.enable_repo(REPOS['rhva6']['id'])
        timestamp = datetime.utcnow()
        self.vm.run('yum install -y {0}'.format(REAL_0_RH_PACKAGE))

        # Find the content host and ensure that tasks started by package
        # installation has finished
        host = entities.Host().search(
            query={'search': 'name={}'.format(self.vm.hostname)})
        wait_for_tasks(
            search_query='label = Actions::Katello::Host::UploadPackageProfile'
            ' and resource_id = {}'
            ' and started_at >= "{}"'.format(host[0].id, timestamp))
        # Force host to generate or refresh errata applicability
        call_entity_method_with_timeout(host[0].errata_applicability,
                                        timeout=600)