Пример #1
0
class DiscoveredHostDetailsView(BaseLoggedInView):
    """Discovered Host details view"""
    breadcrumb = BreadCrumb()
    back = Text(
        ".//a[contains(@class, 'btn') and @data-id='aid_discovered_hosts']")
    actions = ActionsDropdown(
        "//div[contains(@class, 'btn-group')][a[@data-toggle='dropdown']]")
    delete = Text(".//a[contains(@data-confirm, 'Delete')]")
    expand_all = Text(".//a[@id='expand_all']")
    interfaces = SatTable("//div[@id='interfaces-panel']/table")
    highlights = DiscoveredHostDetailsTable(
        "//div[@id='category-highlights']//table")
    storage = DiscoveredHostDetailsTable(
        "//div[@id='category-storage']//table")
    hardware = DiscoveredHostDetailsTable(
        "//div[@id='category-hardware']//table")
    network = DiscoveredHostDetailsTable(
        "//div[@id='category-network']//table")
    software = DiscoveredHostDetailsTable(
        "//div[@id='category-software']//table")
    miscellaneous = DiscoveredHostDetailsTable(
        "//div[@id='category-miscellaneous']//table")

    @property
    def is_displayed(self):
        breadcrumb_loaded = self.browser.wait_for_element(self.breadcrumb,
                                                          exception=False)
        return (breadcrumb_loaded
                and self.breadcrumb.locations[0] == 'Discovered hosts' and
                self.breadcrumb.locations[1].startswith('Discovered host:'))
Пример #2
0
    class errata(SatTab):
        lce_filter = Select(
            locator='.//select[@ng-model="selectedErrataOption"]')
        searchbox = Search()
        apply_selected = ActionsDropdown(
            ".//span[contains(@class, 'btn-group')]")
        recalculate = Button('Recalculate')
        table = SatTable('.//table',
                         column_widgets={
                             0: Checkbox(locator="./input[@type='checkbox']"),
                             'Id': Text('./a'),
                         })

        def search(self, query, lce=None):
            """Apply available filters before proceeding with searching and
            automatically set proper search mask if errata id instead of errata
            title was passed.

            :param str query: search query to type into search field. Both
                errata id (RHEA-2012:0055) and errata title (Sea_Erratum) are
                supported.
            :param str optional lce: filter by lifecycle environment
            :return: list of dicts representing table rows
            :rtype: list
            """
            if lce is not None:
                self.lce_filter.fill(lce)

            if re.search(r'\w{4}-\d{4}:\d{4}', query):
                query = 'id = {}'.format(query)
            self.searchbox.search(query)

            return self.table.read()
Пример #3
0
class PuppetEnvironmentTableView(BaseLoggedInView, SearchableViewMixin):
    """
    Basic view after clicking Configure -> Environments.
    In basic view, there can be seen title Puppet Environments, button
    Create Puppet Environment (new), button import environments
    and table with existing Puppet Environments
    """
    title = Text(".//h1[contains(., 'Puppet Environments')]")
    new = Text(".//a[contains(@href, '/environments/new')]")
    import_environments = Text(
        ".//span[contains(@class, 'btn')]"
        "/a[contains(@href, 'import_environments')]"
    )
    table = SatTable(
        locator='.//table',
        column_widgets={
            'Name': Text(".//a[starts-with(@href, '/environments/') and \
                contains(@href,'/edit')]"),
            'Actions': ActionsDropdown(
                './div[contains(@class, "btn-group")]')
        }
    )

    @property
    def is_displayed(self):
        return self.browser.wait_for_element(
            self.title, exception=False) is not None
Пример #4
0
    class versions(SatTab):
        searchbox = Search()
        table = SatTable(
            locator='//table',
            column_widgets={
                'Version': Text('.//a'),
                'Status': PublishPromoteProgressBar(),
                'Actions':
                ActionsDropdown('./div[contains(@class, "btn-group")]')
            },
        )

        def search(self, version_name):
            """Searches for content view version.

            Searchbox can't search by version name, only by id, that's why in
            case version name was passed, it's transformed into recognizable
            value before filling, for example::

                'Version 1.0' -> 'version = 1'
            """
            search_phrase = version_name
            if version_name.startswith('V') and '.' in version_name:
                search_phrase = 'version = {}'.format(
                    version_name.split()[1].split('.')[0])
            self.searchbox.search(search_phrase)
            return self.table.read()
Пример #5
0
 class repositories(SatTab):
     table = SatTable(
         locator=".//table",
         column_widgets={
             'Name': Text("./a"),
         }
     )
Пример #6
0
    class repository_sets(SatTab, SearchableViewMixin):
        TAB_NAME = 'Repository Sets'

        show_all = Checkbox(
            locator=".//input[contains(@ng-model, 'contentAccessModeAll')]")
        limit_to_lce = Checkbox(
            locator=".//input[contains(@ng-model, 'contentAccessModeEnv')]")
        actions = ActionsDropdown("//div[contains(@class, 'btn-group')]")

        table = SatTable(
            './/table',
            column_widgets={
                0: Checkbox(locator="./input[@type='checkbox']"),
                'Product Name': Text('./a'),
            },
        )

        def read(self):
            """Sometimes no checkboxes are checked off by default, selecting
            "Show All" in such case.
            """
            if self.show_all.read() is False and self.limit_to_lce.read(
            ) is False:
                self.show_all.fill(True)
            return super().read()
Пример #7
0
class ImportPuppetEnvironmentView(BaseLoggedInView, SearchableViewMixin):
    """
    View after clicking Configure -> Environments -> import environments with
    toggles New, Updated, Obsolete. Button update and cancel
    """
    breadcrumb = BreadCrumb()
    new = Text(".//a[contains(@data-original-title,'new')]")
    updated = Text(".//a[contains(@data-original-title,'updated')]")
    obsolete = Text(".//a[contains(@data-original-title,'obsolete')]")
    update = Text(".//input[@name='commit']")
    cancel = Text(".//a[contains(@class, 'btn') and @href='/environments']")
    table = SatTable(
        locator='.//table',
        column_widgets={
            'Environment': Text('./a'),
        }
    )

    @property
    def is_displayed(self):
        breadcrumb_loaded = self.browser.wait_for_element(
            self.breadcrumb, exception=False)
        return (
            breadcrumb_loaded
            and self.breadcrumb.locations[0] == 'Environments'
            and self.breadcrumb.read() == 'Changed Environments'
        )
Пример #8
0
class ContentViewVersionRemoveView(BaseLoggedInView):
    breadcrumb = BreadCrumb()

    table = SatTable(
        locator='.//table',
        column_widgets={
            0: Checkbox(locator="./input[@type='checkbox']"),
        }
    )
    completely = Checkbox(
        locator=".//input[@ng-model='deleteOptions.deleteArchive']")
    next = Text(".//button[@ng-click='processSelection()']")
    cancel = Text(".//button[normalize-space(.)='Cancel']")

    @property
    def is_displayed(self):
        breadcrumb_loaded = self.browser.wait_for_element(
            self.breadcrumb, exception=False)
        return (
                breadcrumb_loaded
                and self.breadcrumb.locations[0] == 'Content Views'
                and len(self.breadcrumb.locations) == 3
                and self.breadcrumb.read() == 'Deletion'
                and self.next.is_displayed
        )
Пример #9
0
    class module_streams(SatTab, SearchableViewMixin):
        TAB_NAME = 'Module Streams'
        status_filter = Select(
            locator='.//select[@ng-model="nutupaneParams.status"]')
        table = SatTable(
            locator='//table',
            column_widgets={
                'Name':
                Text('.//a'),
                'Actions':
                ActionDropdownWithCheckbox(
                    ".//div[contains(@class, 'dropdown')]")
            },
        )

        def search(self, query, status='All'):
            """Searches for Module Streams. Apply available filters before
            proceeding with searching. By default 'All' is passed

            :param str query: search query to type into search field.
            :param str optional status: filter by status of module stream on host
            :return: list of dicts representing table rows
            :rtype: list
            """
            if status is not None:
                self.status_filter.fill(status)
            self.searchbox.search(query)
            return self.table.read()
Пример #10
0
class ModuleStreamView(BaseLoggedInView):
    """Main Module_Streams view"""

    title = Text("//h2[contains(., 'Module Streams')]")
    table = SatTable('.//table', column_widgets={'Name': Text("./a")})

    search_box = CustomSearch()

    def search(self, query):
        """Perform search using search box on the page and return table
        contents.

        :param str query: search query to type into search field. E.g.
            ``name = "bar"``.
        :return: list of dicts representing table rows
        :rtype: list
        """
        self.search_box.search(query)
        return self.table.read()

    @property
    def is_displayed(self):
        """The view is displayed when it's title exists"""
        return self.browser.wait_for_element(self.title,
                                             exception=False) is not None
Пример #11
0
    class packages_installed(SatTabWithDropdown, SearchableViewMixin):
        TAB_NAME = 'Packages'
        SUB_ITEM = 'Installed'

        remove_selected = Button('Remove Selected')
        table = SatTable(
            './/table',
            column_widgets={0: Checkbox(locator="./input[@type='checkbox']")})
Пример #12
0
    class HostSubscription(View):
        ROOT = ".//li[@data-name='Host Subscription Status']"
        subscriptions = SatTable('.//table', column_widgets={0: Text('./a')})

        def fill(self, values):
            if 'type' not in values:
                raise ValueError('You need provide subscription task type')
            self.subscriptions.row((0, 'contains', str(values['type'])))[0].widget.click()
Пример #13
0
    class LatestFailedTasks(View):
        ROOT = ".//li[@data-name='Latest Warning/Error Tasks']"
        tasks = SatTable('.//table', column_widgets={'Name': Text('./a')})

        def fill(self, values):
            if 'name' not in values:
                raise ValueError('You need provide name of the task')
            self.tasks.row(name=values['name'])['Name'].widget.click()
Пример #14
0
class JobInvocationsView(BaseLoggedInView, SearchableViewMixin):
    title = Text("//h1[contains(., 'Job') and contains(., 'nvocations')]")
    new = Text("//a[contains(@href, '/job_invocations/new')]")
    table = SatTable('.//table', column_widgets={'Description': Text('./a')})

    @property
    def is_displayed(self):
        return self.browser.wait_for_element(self.title,
                                             exception=False) is not None
Пример #15
0
class ContentViewTableView(BaseLoggedInView, SearchableViewMixin):
    title = Text("//h2[contains(., 'Content Views')]")
    new = Text("//a[contains(@href, '/content_views/new')]")
    table = SatTable('.//table', column_widgets={'Name': Text('./a')})

    @property
    def is_displayed(self):
        return self.browser.wait_for_element(self.title,
                                             exception=False) is not None
Пример #16
0
    class packages_applicable(SatTabWithDropdown, SearchableViewMixin):
        TAB_NAME = 'Packages'
        SUB_ITEM = 'Applicable'

        upgrade_selected = ActionsDropdown(".//span[contains(@class, 'btn-group')]")
        update_all_packages = Button('Update All Packages')
        table = SatTable(
            './/table', column_widgets={0: Checkbox(locator="./input[@type='checkbox']")}
        )
Пример #17
0
 class affected_repositories(SatSecondaryTab):
     TAB_NAME = 'Affected Repositories'
     filter_toggle = RadioGroup(".//div[@class='col-sm-8']")
     product_filter = Select(locator=".//select[@ng-model='product']")
     searchbox = Search()
     update_repositories = Button('Update Repositories')
     table = SatTable(
         locator='//table',
         column_widgets={0: Checkbox(locator=".//input[@type='checkbox']")},
     )
Пример #18
0
class DiscoveredHostsActionDialog(BaseLoggedInView):
    """Common dialog view for all discovered hosts actions"""
    title = None
    table = SatTable("//div[@class='modal-body']//table")
    submit = Text("//button[@onclick='tfm.hosts.table.submitModalForm()']")

    @property
    def is_displayed(self):
        return self.browser.wait_for_element(self.title,
                                             exception=False) is not None
Пример #19
0
class SelectPuppetModuleVersionView(BaseLoggedInView, SearchableViewMixin):
    title = Text('//h3/span[contains(., "Select an Available Version of")]')
    table = SatTable(locator='.//table',
                     column_widgets={
                         'Actions':
                         Text('./button[@ng-click="selectVersion(item)"]')
                     })

    @property
    def is_displayed(self):
        return self.browser.wait_for_element(self.title,
                                             exception=False) is not None
Пример #20
0
class AddNewPuppetModuleView(BaseLoggedInView, SearchableViewMixin):
    title = Text('//h3/span[text()="Select A New Puppet Module To Add"]')
    table = SatTable(locator='.//table',
                     column_widgets={
                         'Actions':
                         Text('./button[@ng-click="selectVersion(item.name)"]')
                     })

    @property
    def is_displayed(self):
        return self.browser.wait_for_element(self.title,
                                             exception=False) is not None
Пример #21
0
    class TaskStatus(View):
        ROOT = ".//li[@data-name='Task Status']"
        states = SatTable(
            './/table',
            column_widgets={'No. of Tasks': Text('./a')},
        )

        def fill(self, values):
            if 'state' not in values or 'result' not in values:
                raise ValueError('both state and result values have to be provided')
            self.states.row(state=values['state'], result=values['result'])[
                'No. of Tasks'
            ].widget.click()
Пример #22
0
    class rpms(SatSecondaryTab, SearchableViewMixin):
        TAB_NAME = 'RPMs'

        exclude_no_errata = Checkbox(locator=".//input[@type='checkbox']"
                                     "[@ng-model='filter.original_packages']")
        add_rule = Text(".//button[@ng-click='addRule()']")
        remove_rule = Text(".//button[@ng-click='removeRules(filter)']")
        table = SatTable(
            locator='//table',
            column_widgets={
                0: Checkbox(locator=".//input[@type='checkbox']"),
                4: Text("./button[contains(@ng-click, 'rule.editMode')]"),
            },
        )
Пример #23
0
    class filters(SatTabWithDropdown, SearchableViewMixin):
        TAB_NAME = 'Yum Content'
        SUB_ITEM = 'Filters'

        new_filter = Text(".//button[@ui-sref='content-view.yum.filters.new']")
        remove_selected = Text(".//button[@ng-click='removeFilters()']")

        table = SatTable(
            locator='//table',
            column_widgets={
                0: Checkbox(locator=".//input[@type='checkbox']"),
                'Name': Text('./a'),
            },
        )
Пример #24
0
class ProvisioningTemplatesView(BaseLoggedInView, SearchableViewMixin):
    title = Text("//h1[contains(., 'Provisioning Templates')]")
    new = Text("//a[contains(@href, '/templates/provisioning_templates/new')]")
    table = SatTable(
        './/table',
        column_widgets={
            'Name': Text('./a'),
            'Actions': ActionsDropdown("./div[contains(@class, 'btn-group')]"),
        }
    )

    @property
    def is_displayed(self):
        return self.browser.wait_for_element(
            self.title, exception=False) is not None
Пример #25
0
class SelectPuppetModuleVersionView(BaseLoggedInView, SearchableViewMixin):
    breadcrumb = BreadCrumb()
    table = SatTable(locator='.//table',
                     column_widgets={
                         'Actions':
                         Text('./button[@ng-click="selectVersion(item)"]')
                     })

    @property
    def is_displayed(self):
        breadcrumb_loaded = self.browser.wait_for_element(self.breadcrumb,
                                                          exception=False)
        return (breadcrumb_loaded
                and self.breadcrumb.locations[0] == 'Content Views'
                and self.breadcrumb.read() == 'Version for Module:')
Пример #26
0
 class overview(SatTab):
     job_status = Text(
         "//div[@id='job_invocations_chart_container']"
         "//*[name()='tspan'][contains(@class,'donut-title-small-pf')]")
     job_status_progress = Text(
         "//div[@id='job_invocations_chart_container']"
         "//*[name()='tspan'][contains(@class,'donut-title-big-pf')]")
     hosts_table = SatTable(
         './/table',
         column_widgets={
             'Host': Text('./a'),
             'Actions':
             ActionsDropdown("./div[contains(@class, 'btn-group')]"),
         })
     total_hosts = Text("//h2[contains(., 'Total hosts')]"
                        "/span[@class='card-pf-aggregate-status-count']")
Пример #27
0
class EntitySearchView(SatSecondaryTab):
    repo_filter = SatSelect(".//select[@ng-model='repository']")
    searchbox = Search()
    table = SatTable(".//table")

    def search(self, query, repo=None):
        """Apply available filters before proceeding with searching.

        :param str query: search query to type into search field.
        :param str optional repo: filter by repository name
        :return: list of dicts representing table rows
        :rtype: list
        """
        if repo:
            self.repo_filter.fill(repo)
        self.searchbox.search(query)
        return self.table.read()
Пример #28
0
class AnsibleVariablesView(BaseLoggedInView, SearchableViewMixin):
    """Main Ansible Variables view"""

    title = Text("//h1[contains(., text()='Ansible Variables')")
    new_variable = Text("//a[contains(@href, '/ansible/ansible_variables/new')]")
    total_variables = Text(".//span[@class='pagination-pf-items-total']")
    table = SatTable(
        './/table',
        column_widgets={
            'Actions': Text(".//a[@data-method='delete']"),
        },
    )
    pagination = Pagination()

    @property
    def is_displayed(self):
        return self.title.is_displayed and self.new_variable.is_displayed
Пример #29
0
class ContentHostsView(BaseLoggedInView, SearchableViewMixin):
    title = Text("//h2[contains(., 'Content Hosts')]")
    export = Text(
        ".//a[contains(@class, 'btn')][contains(@href, 'content_hosts.csv')]")
    register = Text(".//button[@ui-sref='content-hosts.register']")
    actions = ActionsDropdown(".//div[contains(@class, 'btn-group')]")
    dialog = ConfirmationDialog()
    table = SatTable('.//table',
                     column_widgets={
                         0: Checkbox(locator="./input[@type='checkbox']"),
                         'Name': Text('./a'),
                         'Subscription Status': StatusIcon(),
                         'Installable Updates': InstallableUpdatesCellView(),
                     })

    @property
    def is_displayed(self):
        return self.browser.wait_for_element(self.title,
                                             exception=False) is not None
Пример #30
0
class PackagesView(BaseLoggedInView):
    """Main Packages view"""
    title = Text("//h2[contains(., 'Packages')]")
    table = SatTable('.//table', column_widgets={'RPM': Text("./a")})

    repository = Select(locator=".//select[@ng-model='repository']")
    applicable = Checkbox(locator=".//input[@ng-model='showApplicable']")
    upgradable = Checkbox(locator=".//input[@ng-model='showUpgradable']")
    search_box = Search()

    def search(self,
               query,
               repository='All Repositories',
               applicable=False,
               upgradable=False):
        """Perform search using search box on the page and return table
        contents.

        :param str query: search query to type into search field. E.g.
            ``name = "bar"``.
        :param str repository: repository name to select when searching for the
            package.
        :param bool applicable: To show only applicable packages
        :param bool upgradable: To show only upgradable packages
        :return: list of dicts representing table rows
        :rtype: list
        """
        self.repository.fill(repository)
        # set the upgradable first as if enabled, applicable element will be
        # disabled
        self.upgradable.fill(upgradable)
        if not upgradable:
            self.applicable.fill(applicable)
        self.search_box.search(query)
        return self.table.read()

    @property
    def is_displayed(self):
        """The view is displayed when it's title exists"""
        return self.browser.wait_for_element(self.title,
                                             exception=False) is not None