Example #1
0
    def __init__(self, parent=None):
        self.delete = Button(
            xpath="//div[@id='content']"
            "//button[contains(@class, 'delete-cluster-btn')]",
            element_name="Delete")

        AbstractView.__init__(self, parent)
Example #2
0
 def __init__(self):
     self.stay_on_page_btn = Button(
         xpath=".//button[@class='btn btn-return']",
         element_name="Stay on page button")
     self.leave_page_discard_changes_button = Button(
         xpath=".//button[@class='btn btn-danger proceed-btn']",
         element_name="Leave page and discard changes button")
class AbstractDialog(AbstractView):
    XPATH_DIALOG = "/html/body/div[contains(@class,'modal ')]"

    BUTTON_APPLY = "Apply"
    BUTTON_CREATE = "Create"
    BUTTON_CANCEL = "Cancel"
    BUTTON_DELETE = "Delete"
    BUTTON_DEPLOY = "Deploy"

    def __init__(self):
        self.wait_loading()

        self.elementClose = Button(
            xpath="./div[@class='modal-header']/button[@class='close']",
            element_name="Dialog [x] header icon"
        )
        self.footerButton = Button(
            xpath="./div[@class='modal-footer']/button[contains(.,'{name}')]",
            element_name="Dialog footer button [{name}]"
        )

        AbstractView.__init__(self, self.__get_control_dialog())

    @classmethod
    def __get_control_dialog(cls):
        return cls.get_wait_bot().wait_for_web_element(
            By.XPATH, cls.XPATH_DIALOG)

    def apply(self):
        return self.click_footer_button(self.BUTTON_APPLY)

    def cancel(self):
        return self.click_footer_button(self.BUTTON_CANCEL)

    def click_footer_button(self, name):
        res = self.footerButton.find(name=name).click_and_wait()
        self.wait_closing()
        return res

    def close(self):
        return self.elementClose.click_and_wait()

    def create(self):
        return self.click_footer_button(self.BUTTON_CREATE)

    def delete(self):
        return self.click_footer_button(self.BUTTON_DELETE)

    def deploy(self):
        return self.click_footer_button(self.BUTTON_DEPLOY)

    def wait_closing(self):
        self.get_wait_bot().wait_for_disappears(By.XPATH, self.XPATH_DIALOG)
        self.get_wait_bot().wait_loading()

    def wait_loading(self):
        self.get_wait_bot().wait_for_stop_moving(By.XPATH, self.XPATH_DIALOG)
        self.get_wait_bot().wait_loading()
Example #4
0
    def __init__(self, parent=None):
        self.applyButton = Button(
            xpath=".//button[contains(@class, 'btn-apply')]",
            element_name="Apply")
        self.cancelButton = Button(
            xpath=".//button[contains(@class, 'btn-discard')]",
            element_name="Cancel")

        BasePage.__init__(self, parent)
Example #5
0
    def __init__(self, parent=None):
        self.applyButton = Button(
            xpath=".//button[contains(@class, 'btn-apply')]",
            element_name="Apply"
        )
        self.cancelButton = Button(
            xpath=".//button[contains(@class, 'btn-discard')]",
            element_name="Cancel"
        )

        BasePage.__init__(self, parent)
Example #6
0
    def __init__(self):
        self.wait_loading()

        self.elementClose = Button(
            xpath="./div[@class='modal-header']/button[@class='close']",
            element_name="Dialog [x] header icon")
        self.footerButton = Button(
            xpath=".//div[contains(@class,'modal-footer')]"
            "/button[contains(.,'{name}')]",
            element_name="Dialog footer button [{name}]")

        AbstractView.__init__(self, self.__get_control_dialog())
    def __init__(self):
        self.wait_loading()

        self.elementClose = Button(
            xpath="./div[@class='modal-header']/button[@class='close']",
            element_name="Dialog [x] header icon"
        )
        self.footerButton = Button(
            xpath="./div[@class='modal-footer']/button[contains(.,'{name}')]",
            element_name="Dialog footer button [{name}]"
        )

        AbstractView.__init__(self, self.__get_control_dialog())
Example #8
0
class ConfirmLeavePageDialog(AbstractDialog):
    def __init__(self):
        self.stay_on_page_btn = Button(
            xpath=".//button[@class='btn btn-return']",
            element_name="Stay on page button")
        self.leave_page_discard_changes_button = Button(
            xpath=".//button[@class='btn btn-danger proceed-btn']",
            element_name="Leave page and discard changes button")

    def click_stay_on_page(self):
        return self.stay_on_page_btn.click_and_wait()

    def click_leave_page(self):
        return self.leave_page_discard_changes_button.click_and_wait()
Example #9
0
 def __init__(self):
     self.configure = Button(
         xpath="./tbody/tr[{row}]/td[{column}]/button",
         element_name="Configure"
     )
     self.progress = HtmlElement(
         xpath="./tbody/tr[{row}]/td[{column}]"
               "//div[contains(@class, 'progress')]",
         element_name="progress bar"
     )
     Table.__init__(self, HtmlElement(
         xpath=".//table[contains(@class, 'releases-table')]",
         element_name="Releases table"
     ).get_element())
Example #10
0
    def __init__(self):
        self.cancelChanges = Button(
            xpath="//button[contains(@class, 'btn-revert-changes')]",
            element_name="Cancel Changes")

        self.loadDefaults = Button(
            xpath="//button[contains(@class, 'btn-defaults')]",
            element_name="Load Changes")

        self.backToNodeList = Button(
            xpath="//button[contains(@class, 'btn-return')]",
            element_name="Back To Node List")

        AbstractView.__init__(self)
Example #11
0
    def __init__(self, parent=None):
        self.tab = HtmlElement(
            xpath="//div[@id='content']//ul[contains(@class, 'nav nav-tabs')]"
                  "/li/a[b[@class='{}']]",
            element_name="Tab"
        )
        self.deployChanges = Button(
            xpath="//button[contains(@class, 'deploy-btn')]",
            element_name="Deploy Changes"
        )
        self.deploymentBar = HtmlElement(
            xpath="//li[contains(@class, 'deployment-control')]"
                  "//div[contains(@class, 'progress-deploy')]",
            element_name="Deployment progress")

        self.successMessage = HtmlElement(
            xpath="//div[contains(@class, 'global-success')]/p",
            element_name="Success message"
        )

        self.errorMessage = HtmlElement(
            xpath="//div[contains(@class, 'global-error')]/p",
            element_name="Error message"
        )

        AbstractView.__init__(self, parent)
Example #12
0
    def __init__(self, parent=None):
        self.ip_range_start = Input(xpath=".//input[@name='ip_ranges-start']",
                                    element_name="Ip range start")

        self.ip_range_end = Input(xpath=".//input[@name='ip_ranges-end']",
                                  element_name="Ip range end")

        self.ip_range_add = Button(
            xpath=".//button[contains(@class,'ip-ranges-add')]",
            element_name="Ip range add")

        self.ip_range_delete = Button(
            xpath=".//button[contains(@class,'ip-ranges-delete')]",
            element_name="Ip range delete")

        BasePage.__init__(self, parent)
Example #13
0
class AbstractView(BasePage):
    def __init__(self, parent=None):
        self.applyButton = Button(
            xpath=".//button[contains(@class, 'btn-apply')]",
            element_name="Apply")
        self.cancelButton = Button(
            xpath=".//button[contains(@class, 'btn-discard')]",
            element_name="Cancel")

        BasePage.__init__(self, parent)

    def apply(self):
        return self.applyButton.click()

    def cancel(self):
        return self.cancelButton.click_and_wait()
Example #14
0
    def __init__(self, parent=None):
        self.delete = Button(
            xpath="//div[@id='content']"
                  "//button[contains(@class, 'delete-cluster-btn')]",
            element_name="Delete"
        )

        AbstractView.__init__(self, parent)
Example #15
0
    def __init__(self, parent=None):
        self.addCompute = Link(
            xpath="//div[@id='tab-nodes']"
                  "//div[contains(@class, 'node-list-compute')]"
                  "//a[contains(@class, 'btn-add-nodes')]",
            element_name="Add compute"
        )
        self.addController = Link(
            xpath="//div[@id='tab-nodes']"
                  "//div[contains(@class, 'node-list-controller')]"
                  "//a[contains(@class, 'btn-add-nodes')]",
            element_name="Add controller"
        )
        self.addCinder = Link(
            xpath="//div[@id='tab-nodes']"
                  "//div[contains(@class, 'node-list-cinder')]"
                  "//a[contains(@class, 'btn-add-nodes')]",
            element_name="Add controller"
        )
        self.computes = Button(
            xpath="//div[@id='tab-nodes']"
                  "//div[contains(@class, 'node-list-compute')]",
            element_name="computes"
        )
        self.controllers = HtmlElement(
            xpath="//div[@id='tab-nodes']"
                  "//div[contains(@class, 'node-list-controller')]",
            element_name="controllers"
        )
        self.cinders = Button(
            xpath="//div[@id='tab-nodes']"
                  "//div[contains(@class, 'node-list-cinder')]",
            element_name="cinders"
        )
        self.deploymentMode = Link(
            xpath="//li[contains(@class, 'change-cluster-mode-btn')]",
            element_name="Deployment mode"
        )
        self.alertError = HtmlElement(
            xpath="//div[contains(@class, 'alert-block') "
                  "and contains(@class, 'global-error')]/p",
            element_name="Alert Error"
        )

        AbstractView.__init__(self, parent)
Example #16
0
class AbstractView(BasePage):
    def __init__(self, parent=None):
        self.applyButton = Button(
            xpath=".//button[contains(@class, 'btn-apply')]",
            element_name="Apply"
        )
        self.cancelButton = Button(
            xpath=".//button[contains(@class, 'btn-discard')]",
            element_name="Cancel"
        )

        BasePage.__init__(self, parent)

    def apply(self):
        return self.applyButton.click()

    def cancel(self):
        return self.cancelButton.click_and_wait()
Example #17
0
class Releases_Table(Table):

    def __init__(self):
        self.configure = Button(
            xpath="./tbody/tr[{row}]/td[{column}]/button",
            element_name="Configure"
        )
        self.progress = HtmlElement(
            xpath="./tbody/tr[{row}]/td[{column}]"
                  "//div[contains(@class, 'progress')]",
            element_name="progress bar"
        )
        Table.__init__(self, HtmlElement(
            xpath=".//table[contains(@class, 'releases-table')]",
            element_name="Releases table"
        ).get_element())

    def get_release_row(self, release_name):
        return self.get_row(1, release_name)

    def get_release_status(self, release_name):
        return self.get_value(self.get_release_row(release_name), 3)

    def click_configure(self, release_name):
        return self.configure.find(
            row=self.get_row(1, release_name),
            column=4
        ).click()

    def verify_releases_count(self, count):
        return self.get_verify_bot().verify_equal(
            count, self.get_rows_count(), "Releases table", "rows count"
        )

    def verify_release_status(self, release_name, status):
        return self.get_verify_bot().verify_equal(
            expected=status,
            actual=self.get_release_status(release_name),
            name=release_name,
            _type="status"
        )

    def wait_downloading(self, release_name):
        rl = ResultList(
            "Wait release downloading done: {}".format(release_name))
        row = self.get_release_row(release_name=release_name)
        rl.push(self.progress.find(row=row, column=3).verify_visible(True))
        rl.info("Release download started")
        if self.get_wait_bot().wait_for_web_element_disappears(
                web_element=self.progress.get_element(),
                timeout=20,
                poll_frequency=3) is not None:
            rl.info("Release download done")
        else:
            rl.push(Result("Release download failed on timeout", False))
        return rl
Example #18
0
 def __init__(self, parent=None):
     self.checkbox_role = Checkbox(
         xpath="//input[@type='checkbox' and @value='{role}']",
         element_name="Checkbox '{role}'")
     self.assign = Button(
         xpath=".//button[@class='btn btn-success btn-assign']",
         element_name="Assign button")
     self.conflict_role = HtmlElement(
         xpath=".//div[@class='role-conflict '{role}'']",
         element_name="Conflict '{role}'")
     AbstractView.__init__(self, parent)
Example #19
0
class Cluster_Actions_View(AbstractView):
    def __init__(self, parent=None):
        self.delete = Button(
            xpath="//div[@id='content']"
            "//button[contains(@class, 'delete-cluster-btn')]",
            element_name="Delete")

        AbstractView.__init__(self, parent)

    def click_delete_cluster_button(self):
        return self.delete.click()
Example #20
0
class Cluster_Actions_View(AbstractView):
    def __init__(self, parent=None):
        self.delete = Button(
            xpath="//div[@id='content']"
                  "//button[contains(@class, 'delete-cluster-btn')]",
            element_name="Delete"
        )

        AbstractView.__init__(self, parent)

    def click_delete_cluster_button(self):
        return self.delete.click()
Example #21
0
    def __init__(self, parent=None):
        self.tab = HtmlElement(
            xpath="//div[@id='content']//ul[contains(@class, 'nav nav-tabs')]"
            "/li/a[b[@class='{}']]",
            element_name="Tab")
        self.deployChanges = Button(
            xpath="//button[contains(@class, 'deploy-btn')]",
            element_name="Deploy Changes")
        self.deploymentBar = HtmlElement(
            xpath="//li[contains(@class, 'deployment-control')]"
            "//div[contains(@class, 'progress-deploy')]",
            element_name="Deployment progress")

        self.successMessage = HtmlElement(
            xpath="//div[contains(@class, 'global-success')]/p",
            element_name="Success message")

        self.errorMessage = HtmlElement(
            xpath="//div[contains(@class, 'global-error')]/p",
            element_name="Error message")

        AbstractView.__init__(self, parent)
Example #22
0
    def __init__(self, parent=None):
        self.addNodes = Link(
            xpath="//div//a[@class='btn btn-success btn-add-nodes']",
            element_name="Add nodes"
        )
        self.deleteNodes = Button(
            xpath="//button[contains(@class,'btn-delete-nodes')]",
            element_name="Delete nodes"
        )
        self.reassignRoles = Button(
            xpath="//button[contains(@class, 'btn-assign-roles')]"
                  "and contains(text(),'Reassign Roles')]",
            element_name="Reassign roles"
        )
        self.assignRoles = Button(
            xpath="//button[contains("
                  "@class, 'btn btn-success btn-assign-roles') "
                  "and contains(text(),'Assign Roles')]",
            element_name="Assign roles"
        )
        self.environment_status = HtmlElement(
            xpath="//div[@class='environment-status']",
            element_name="Environment status"
        )
        self.groupBy = Select(
            xpath="//div[@class='cluster-toolbar-item nodes-filter']"
                  "//select[@name='grouping']",
            element_name="Select group by"
        )
        self.backToEnvironmentNodeList = Button(
            xpath="//div[@class='btn btn-go-to-cluster']",
            element_name="Back to Environment Node List"
        )

        self.nodelist = HtmlElement(
            xpath="//div[@class='node-groups' and "
                  "contains(div[@class='row-fluid node-group-header']"
                  "//h4/text(),'{role}')]",
            element_name="'{role}' block"
        )
        self.deploymentMode = Button(
            xpath="//button[contains(@class,'btn btn-cluster-actions')]",
            element_name="Deployment mode"
        )
        self.alertError = HtmlElement(
            xpath="//div[contains(@class, 'alert-block') "
                  "and contains(@class, 'global-error')]/p",
            element_name="Alert Error"
        )

        AbstractView.__init__(self, parent)
class Cluster_View(AbstractView):
    def __init__(self, parent=None):
        self.tab = HtmlElement(
            xpath="//div[@id='content']//ul[contains(@class, 'nav nav-tabs')]"
                  "/li[.//b[@class='{}']]",
            element_name="Tab"
        )
        self.deployChanges = Button(
            xpath="//button[contains(@class, 'deploy-btn')]",
            element_name="Deploy Changes"
        )
        self.deploymentBar = HtmlElement(
            xpath="//li[contains(@class, 'deployment-control')]"
                  "//div[contains(@class, 'progress-deploy')]",
            element_name="Deployment progress")

        self.successMessage = HtmlElement(
            xpath="//div[contains(@class, 'global-success')]/p",
            element_name="Success message"
        )

        AbstractView.__init__(self, parent)

    def click_actions_tab(self):
        return ResultList("Click actions tab") \
            .push(self.tab.find("tab-actions-normal").click())

    def click_deploy_changes(self):
        return self.deployChanges.click()

    def wait_deployment_done(self, seconds):
        return Result(
            "Wait for deployment done ({})".format(seconds),
            WaitBot(seconds).wait_for_disappears(
                By.XPATH,
                "//li[contains(@class, 'deployment-control')]"
                "//div[contains(@class, 'progress-deploy')] "
            )
        )

    def verify_success_message(self, value):
        return self.successMessage.verify_value_contains(value)
Example #24
0
    def __init__(self, parent=None):
        self.caption = HtmlElement(
            xpath=".//div[contains(@class,'disk-box-name')]",
            element_name="Caption")

        self.total_space = HtmlElement(
            xpath=".//div[contains(@class,'disk-box-size')]",
            element_name="Total space")

        self.bootable_marker = HtmlElement(
            xpath=".//div[contains(@class,'disk-box-name')]/span",
            element_name="Disk's bootable marker")

        self.volume_group = HtmlElement(
            xpath=".//div[contains(@class,'volume-group') and "
            ".//div[@class='volume-group-name']='{name}']",
            element_name="Volume group {name}")

        self.disk_parameter = HtmlElement(
            xpath=".//div[contains(@class,'disk-map-details-item')]",
            element_name="Disk parameter {name}")

        self.disk_map_details = HtmlElement(
            xpath=".//div[contains(@class,'disk-map-details-item') and "
            "div[@class='disk-map-details-name']='{name}']/"
            "div[@class='disk-map-details-parameter']",
            element_name="Disk parameter {name}")

        self.volume_group_box = HtmlElement(
            xpath=".//div[contains(@class,'volume-group-box') and "
            "div[@class='volume-group-box-name']='{name}']",
            element_name="Volume group box {name}")

        self.make_bootable = Button(xpath=".//button[text()='Make Bootable']",
                                    element_name="Make Bootable")

        self.disk_map = HtmlElement(
            xpath=".//div[@class='disk-map-short disk-map-full']",
            element_name="Disk map")

        BasePage.__init__(self, parent)
Example #25
0
    def __init__(self, parent=None):
        self.log_node = Select(
            xpath=".//div[contains(@class,'log-type-filter')]/select",
            element_name="Logs")

        self.source = Select(
            xpath=".//div[contains(@class,'log-source-filter')]/select",
            element_name="Source")

        self.level = Select(
            xpath=".//div[contains(@class,'log-level-filter')]/select",
            element_name="Min. level")

        self.show_button = Button(
            xpath=".//button[contains(@class,'show-logs-btn')]",
            element_name="Show")

        self.table_logs = HtmlElement(
            xpath=".//table[contains(@class,'table-logs')]",
            element_name="Logs table")

        AbstractView.__init__(self, parent)
Example #26
0
    def __init__(self, parent=None):
        self.save_settings = Button(
            xpath=".//button[contains(@class, 'btn-apply-changes')]",
            element_name="Save Settings")

        self.cancel_changes = Button(
            xpath=".//button[contains(@class, 'btn-revert-changes')]",
            element_name="Cancel Changes")

        self.load_defaults = Button(
            xpath=".//button[contains(@class, 'btn btn-load-defaults')]",
            element_name="Load Defaults")

        self.parameter_input = Input(
            xpath=".//label[contains(@class,'parameter-box') and "
                  "div[contains(@class,'parameter-name')]='{name}']//"
                  "input[@type='text']",
            element_name="Parameter {name}")

        self.parameter_radio = Radio(
            xpath=".//label[contains(@class,'parameter-box') and "
                  "div[contains(@class,'parameter-name')]='{name}']",
            element_name="Parameter {name}")

        self.parameter_checkbox = Checkbox(
            xpath=".//label[contains(@class,'parameter-box') and "
                  "div[contains(@class,'parameter-name')]='{name}']//"
                  "input[@type='checkbox']",
            element_name="Parameter {name}")

        self.show_password = Button(
            xpath=".//span[@class='add-on' "
                  "and i[contains(@class, 'icon-eye')]]",
            element_name="Show password button")

        self.show_password_on = Button(
            xpath=".//i[@class ='icon-eye' and @style='display: inline;']",
            element_name="Show password button")

        self.show_password_off = Button(
            xpath=".//i[@class ='icon-eye-off hide' "
                  "and @style='display: inline;']",
            element_name="Show password button")

        AbstractView.__init__(self, parent)
Example #27
0
class Cluster_Nodes_View(AbstractView):
    def __init__(self, parent=None):
        self.addNodes = Link(
            xpath="//div//a[@class='btn btn-success btn-add-nodes']",
            element_name="Add nodes"
        )
        self.deleteNodes = Button(
            xpath="//button[contains(@class,'btn-delete-nodes')]",
            element_name="Delete nodes"
        )
        self.reassignRoles = Button(
            xpath="//button[contains(@class, 'btn-assign-roles')]"
                  "and contains(text(),'Reassign Roles')]",
            element_name="Reassign roles"
        )
        self.assignRoles = Button(
            xpath="//button[contains("
                  "@class, 'btn btn-success btn-assign-roles') "
                  "and contains(text(),'Assign Roles')]",
            element_name="Assign roles"
        )
        self.environment_status = HtmlElement(
            xpath="//div[@class='environment-status']",
            element_name="Environment status"
        )
        self.groupBy = Select(
            xpath="//div[@class='cluster-toolbar-item nodes-filter']"
                  "//select[@name='grouping']",
            element_name="Select group by"
        )
        self.backToEnvironmentNodeList = Button(
            xpath="//div[@class='btn btn-go-to-cluster']",
            element_name="Back to Environment Node List"
        )

        self.nodelist = HtmlElement(
            xpath="//div[@class='node-groups' and "
                  "contains(div[@class='row-fluid node-group-header']"
                  "//h4/text(),'{role}')]",
            element_name="'{role}' block"
        )
        self.deploymentMode = Button(
            xpath="//button[contains(@class,'btn btn-cluster-actions')]",
            element_name="Deployment mode"
        )
        self.alertError = HtmlElement(
            xpath="//div[contains(@class, 'alert-block') "
                  "and contains(@class, 'global-error')]/p",
            element_name="Alert Error"
        )

        AbstractView.__init__(self, parent)

    def click_deployment_mode(self):
        return self.deploymentMode.click()

    @catch_stale_error
    def click_add_nodes(self):
        return self.addNodes.click_and_wait()

    def select_environment_mode(self, deploymentMode):
        rl = ResultList(
            "Select environment mode [{mode}]".format(
                mode=deploymentMode)
        )
        rl.push(self.click_deployment_mode())
        rl.push(CreateEnvironmentDialog().select_deployment_mode(
            deploymentMode
        ))
        rl.push(CreateEnvironmentDialog().clickNext())
        return rl

    @catch_stale_error
    def verify_nodes(self, role, nodes):
        return Cluster_Nodes_ListView(
            self.nodelist.find(role=role).get_element()
        ).verify_nodes(*nodes)

    def get_nodes(self, role):
        return Cluster_Nodes_ListView(
            self.nodelist.find(role=role).get_element()).get_nodes()

    def verify_node_with_role_not_exists(self, role, *args):
        return Cluster_Nodes_ListView(
            self.nodelist.find(role=role).get_element()
        ).verify_nodes_not_exist(*args)

    def verify_error_contains(self, *args):
        rl = ResultList("Verify error alert contains")
        for string in args:
            rl.push(Result(
                "String [{string}] exists".format(string=string),
                self.alertError.get_value().find(string) != -1
            ))
        return rl

    def verify_nodelists_visibility(self, value, *roles):
        rl = ResultList("Verify node lists visibility")
        for role in roles:
            rl.push(VerifyBot().verify_visibility(
                self.nodelist.find(role=role).get_element(),
                value, "'{role}' nodelist"))
        return rl

    def verify_amount(self, elements_role, value):
        result = None
        try:
            elements = self.get_nodes(role=elements_role)

            if value == 0:
                result = Result(
                    "Verify if amount of {role} is 0".format(
                        role=elements_role, value=value),
                    VerifyBot().verify_visibility(
                        elements, False, elements_role).i_passed())
            else:
                result = Result(
                    "Verify if amount of {role} is {value}".format(
                        role=elements_role, value=value),
                    len(elements) == value)

        except ElementNotFoundException:
            if value == 0:
                result = Result("There are no {name}".format(
                    role=elements_role), True)
        return result

    def select_nodes(self, *args):
        rl = ResultList("Select nodes")
        for name in args:
            node = Node(Cluster_Nodes_ListView().node.find(
                name=name).get_element())
            rl.push(node.select())
        return rl

    def select_roles(self, *roles):
        rl = ResultList("Select roles")
        for role in roles:
            rl.push(RolesPanel().checkbox_role.find(role=role).set_value('on'))
        return rl

    def assign_roles_to_nodes(self, roles, node_names):
        rl = ResultList("Select nodes and assign roles")
        rl.push(self.select_nodes(*node_names))
        rl.push(self.select_roles(*roles))
        rl.push(self.apply())
        ActionBot().wait_for_time(2)
        return rl

    def delete_nodes(self, *args):
        rl = ResultList("Delete nodes")
        rl.push(self.select_nodes(*args))
        rl.push(self.deleteNodes.click_and_wait())
        rl.push(DeleteNodeDialog().delete())
        return rl
Example #28
0
class Cluster_View(AbstractView):
    def __init__(self, parent=None):
        self.tab = HtmlElement(
            xpath="//div[@id='content']//ul[contains(@class, 'nav nav-tabs')]"
                  "/li/a[b[@class='{}']]",
            element_name="Tab"
        )
        self.deployChanges = Button(
            xpath="//button[contains(@class, 'deploy-btn')]",
            element_name="Deploy Changes"
        )
        self.deploymentBar = HtmlElement(
            xpath="//li[contains(@class, 'deployment-control')]"
                  "//div[contains(@class, 'progress-deploy')]",
            element_name="Deployment progress")

        self.successMessage = HtmlElement(
            xpath="//div[contains(@class, 'global-success')]/p",
            element_name="Success message"
        )

        self.errorMessage = HtmlElement(
            xpath="//div[contains(@class, 'global-error')]/p",
            element_name="Error message"
        )

        AbstractView.__init__(self, parent)

    def click_actions_tab(self):
        return ResultList("Click actions tab") \
            .push(self.tab.find("tab-actions-normal").click_and_wait())

    def click_logs_tab(self):
        return ResultList("Click logs tab") \
            .push(self.tab.find("tab-logs-normal").click_and_wait())

    def click_network_settings_tab(self):
        return ResultList("Click network settings tab") \
            .push(self.tab.find("tab-network-normal").click_and_wait())

    def click_openstack_settings_tab(self):
        return ResultList("Click OpenStack settings tab")\
            .push(self.tab.find("tab-settings-normal").click_and_wait())

    def click_deploy_changes(self):
        return self.deployChanges.click()

    def wait_deployment_done(self, seconds, poll_frequency=5):
        return Result(
            "Wait for deployment done ({})".format(seconds),
            WaitBot(seconds).wait_for_disappears(
                By.XPATH,
                "//li[contains(@class, 'deployment-control')]"
                "//div[contains(@class, 'progress-deploy')] ",
                poll_frequency=poll_frequency
            )
        )

    def verify_success_message(self, value):
        return self.successMessage.verify_value_contains(value)

    def verify_successful_deployment_per_name(self, name):
        return self.verify_success_message(
            "Deployment of environment '{name}' is done."
            " Access the OpenStack dashboard (Horizon) at"
            .format(name=name)
        )

    def verify_error_message(self, value):
        return self.errorMessage.verify_value_contains(value)
Example #29
0
class Cluster_View(AbstractView):
    def __init__(self, parent=None):
        self.tab = HtmlElement(
            xpath="//div[@id='content']//ul[contains(@class, 'nav nav-tabs')]"
            "/li/a[b[@class='{}']]",
            element_name="Tab")
        self.deployChanges = Button(
            xpath="//button[contains(@class, 'deploy-btn')]",
            element_name="Deploy Changes")
        self.deploymentBar = HtmlElement(
            xpath="//li[contains(@class, 'deployment-control')]"
            "//div[contains(@class, 'progress-deploy')]",
            element_name="Deployment progress")

        self.successMessage = HtmlElement(
            xpath="//div[contains(@class, 'global-success')]/p",
            element_name="Success message")

        self.errorMessage = HtmlElement(
            xpath="//div[contains(@class, 'global-error')]/p",
            element_name="Error message")

        AbstractView.__init__(self, parent)

    def click_actions_tab(self):
        return ResultList("Click actions tab") \
            .push(self.tab.find("tab-actions-normal").click_and_wait())

    def click_logs_tab(self):
        return ResultList("Click logs tab") \
            .push(self.tab.find("tab-logs-normal").click_and_wait())

    def click_network_settings_tab(self):
        return ResultList("Click network settings tab") \
            .push(self.tab.find("tab-network-normal").click_and_wait())

    def click_openstack_settings_tab(self):
        return ResultList("Click OpenStack settings tab")\
            .push(self.tab.find("tab-settings-normal").click_and_wait())

    def click_deploy_changes(self):
        return self.deployChanges.click()

    def wait_deployment_done(self, seconds, poll_frequency=5):
        return Result(
            "Wait for deployment done ({})".format(seconds),
            WaitBot(seconds).wait_for_disappears(
                By.XPATH, "//li[contains(@class, 'deployment-control')]"
                "//div[contains(@class, 'progress-deploy')] ",
                poll_frequency=poll_frequency))

    def verify_success_message(self, value):
        return self.successMessage.verify_value_contains(value)

    def verify_successful_deployment_per_name(self, name):
        return self.verify_success_message(
            "Deployment of environment '{name}' is done."
            " Access the OpenStack dashboard (Horizon) at".format(name=name))

    def verify_error_message(self, value):
        return self.errorMessage.verify_value_contains(value)
Example #30
0
class AbstractDialog(AbstractView):
    XPATH_DIALOG = "/html/body/div[contains(@class,'modal ')]"

    BUTTON_APPLY = "Apply"
    BUTTON_CREATE = "Create"
    BUTTON_CANCEL = "Cancel"
    BUTTON_DELETE = "Delete"
    BUTTON_DEPLOY = "Deploy"
    BUTTON_NEXT = "Next >"
    BUTTON_PREV = "< Prev"

    def __init__(self):
        self.wait_loading()

        self.elementClose = Button(
            xpath="./div[@class='modal-header']/button[@class='close']",
            element_name="Dialog [x] header icon")
        self.footerButton = Button(
            xpath=".//div[contains(@class,'modal-footer')]"
            "/button[contains(.,'{name}')]",
            element_name="Dialog footer button [{name}]")

        AbstractView.__init__(self, self.__get_control_dialog())

    @classmethod
    def __get_control_dialog(cls):
        return cls.get_wait_bot().wait_for_web_element(By.XPATH,
                                                       cls.XPATH_DIALOG)

    def apply(self):
        return self.click_footer_button(self.BUTTON_APPLY)

    def cancel(self):
        return self.click_footer_button(self.BUTTON_CANCEL)

    def click_footer_button(self, name, wait_closing=True):
        res = self.footerButton.find(name=name).click_and_wait()
        if wait_closing:
            self.wait_closing()
        return res

    def close(self):
        return self.elementClose.click_and_wait()

    def create(self):
        return self.click_footer_button(self.BUTTON_CREATE)

    def delete(self):
        return self.click_footer_button(self.BUTTON_DELETE)

    def deploy(self):
        return self.click_footer_button(self.BUTTON_DEPLOY)

    def deploy_button(self):
        return self.footerButton.find(name=self.BUTTON_DEPLOY)

    def clickNext(self, wait_closing=False):
        return self.click_footer_button(self.BUTTON_NEXT, wait_closing)

    def clickPrev(self):
        return self.click_footer_button(self.BUTTON_PREV, False)

    def wait_closing(self):
        self.get_wait_bot().wait_for_disappears(By.XPATH, self.XPATH_DIALOG)
        self.get_wait_bot().wait_loading()

    def wait_loading(self):
        self.get_wait_bot().wait_for_stop_moving(By.XPATH, self.XPATH_DIALOG)
        self.get_wait_bot().wait_for_stop_resizing(By.XPATH, self.XPATH_DIALOG)
        self.get_wait_bot().wait_loading()
Example #31
0
    def __init__(self, parent=None):
        self.save_settings = Button(
            xpath=".//div[contains(@class, 'apply-btn')]",
            element_name="Save Settings")

        self.cancel_changes = Button(
            xpath=".//div[contains(@class, 'btn-revert-changes')]",
            element_name="Cancel Changes")

        self.verify_networks = Button(
            xpath=".//div[contains(@class, 'verify-networks-btn')]",
            element_name="Verify networks")

        self.flat_dhcp_manager = Radio(xpath=".//div[@class='custom-tumbler' "
                                       "and input[@value='FlatDHCPManager']]",
                                       element_name="FlatDHCP Manager")

        self.vlan_manager = Radio(xpath=".//div[@class='custom-tumbler' "
                                  "and input[@value='VlanManager']]",
                                  element_name="Vlan Manager")

        self.ip_range_row = HtmlElement(
            xpath=".//div[@class='{name}']/"
            "div[contains(@class,'range-row ')][{num}]",
            element_name="Range row {name} [{num}]")

        self.public_vlan_id = Input(
            xpath=".//input[@name='public-vlan_start']",
            element_name="Public VLAN ID")

        self.public_netmask = Input(xpath=".//input[@name='public-netmask']",
                                    element_name="Public Netmask")

        self.public_gateway = Input(xpath=".//input[@name='public-gateway']",
                                    element_name="Public Gateway")

        self.management_cidr = Input(xpath=".//input[@name='management-cidr']",
                                     element_name="Management CIDR")

        self.management_vlan_id = Input(
            xpath=".//input[@name='management-vlan_start']",
            element_name="Management VLAN ID")

        self.storage_cidr = Input(xpath=".//input[@name='storage-cidr']",
                                  element_name="Storage CIDR")

        self.storage_vlan_id = Input(
            xpath=".//input[@name='storage-vlan_start']",
            element_name="Storage VLAN ID")

        self.vm_networks_cidr = Input(xpath=".//input[@name='fixed-cidr']",
                                      element_name="VM Networks CIDR")

        self.vm_networks_vlan_id = Input(
            xpath=".//input[@name='fixed-vlan_start']",
            element_name="VM Networks VLAN ID")

        self.vm_networks_vlan_id_range_start = Input(
            xpath=".//input[@name='fixed-vlan_range-start']",
            element_name="VM Networks VLAN ID range start")

        self.vm_networks_vlan_id_range_end = Input(
            xpath=".//input[@name='fixed-vlan_range-end']",
            element_name="VM Networks VLAN ID range end")

        self.vm_networks_number_of_networks = Input(
            xpath=".//input[@name='fixed-amount']",
            element_name="VM Networks. Number of networks")

        self.vm_networks_size_of_networks = Select(
            xpath=".//select[@name='fixed-network_size']",
            element_name="VM Networks. Size of networks")

        self.verify_networks = Button(
            xpath=".//button[contains(@class,'verify-networks-btn')]",
            element_name="Verify networks")

        self.cancel_changes = Button(
            xpath=".//button[contains(@class, 'btn-revert-changes')]",
            element_name="Cancel changes")
        self.save_settings = Button(
            xpath=".//button[contains(@class, 'btn-success apply-btn')]",
            element_name="Save settings")

        AbstractView.__init__(self, parent)
Example #32
0
class Cluster_Nodes_View(AbstractView):
    def __init__(self, parent=None):
        self.addCompute = Link(
            xpath="//div[@id='tab-nodes']"
                  "//div[contains(@class, 'node-list-compute')]"
                  "//a[contains(@class, 'btn-add-nodes')]",
            element_name="Add compute"
        )
        self.addController = Link(
            xpath="//div[@id='tab-nodes']"
                  "//div[contains(@class, 'node-list-controller')]"
                  "//a[contains(@class, 'btn-add-nodes')]",
            element_name="Add controller"
        )
        self.addCinder = Link(
            xpath="//div[@id='tab-nodes']"
                  "//div[contains(@class, 'node-list-cinder')]"
                  "//a[contains(@class, 'btn-add-nodes')]",
            element_name="Add controller"
        )
        self.computes = Button(
            xpath="//div[@id='tab-nodes']"
                  "//div[contains(@class, 'node-list-compute')]",
            element_name="computes"
        )
        self.controllers = HtmlElement(
            xpath="//div[@id='tab-nodes']"
                  "//div[contains(@class, 'node-list-controller')]",
            element_name="controllers"
        )
        self.cinders = Button(
            xpath="//div[@id='tab-nodes']"
                  "//div[contains(@class, 'node-list-cinder')]",
            element_name="cinders"
        )
        self.deploymentMode = Link(
            xpath="//li[contains(@class, 'change-cluster-mode-btn')]",
            element_name="Deployment mode"
        )
        self.alertError = HtmlElement(
            xpath="//div[contains(@class, 'alert-block') "
                  "and contains(@class, 'global-error')]/p",
            element_name="Alert Error"
        )

        AbstractView.__init__(self, parent)

    def click_add_compute(self):
        return self.addCompute.click_and_wait()

    def click_add_controller(self):
        return self.addController.click_and_wait()

    def click_add_cinder(self):
        return self.addCinder.click_and_wait()

    def click_deployment_mode(self):
        return self.deploymentMode.click()

    def select_environment_mode(self, deploymentMode):
        rl = ResultList(
            "Select environment mode [{mode}]".format(
                mode=deploymentMode)
        )
        rl.push(self.click_deployment_mode())
        rl.push(EnvironmentDeploymentModeDialog().populate(
            deploymentMode=deploymentMode,
            submit=True
        ))
        return rl

    def verify_cinder_nodes(self, *args):
        return Cluster_Nodes_ListView(
            self.cinders.get_element()
        ).verify_nodes(*args)

    def verify_compute_nodes(self, *args):
        return Cluster_Nodes_ListView(
            self.computes.get_element()
        ).verify_nodes(*args)

    def verify_controller_nodes(self, *args):
        return Cluster_Nodes_ListView(
            self.controllers.get_element()
        ).verify_nodes(*args)

    def get_nodes_controllers(self):
        return Cluster_Nodes_ListView(self.controllers.get_element())\
            .get_nodes()

    def get_nodes_computes(self):
        return Cluster_Nodes_ListView(self.computes.get_element())\
            .get_nodes()

    def get_nodes_cinders(self):
        return Cluster_Nodes_ListView(self.cinders.get_element())\
            .get_nodes()

    def verify_error_contains(self, *args):
        rl = ResultList("Verify error alert contains")
        for string in args:
            rl.push(Result(
                "String [{string}] exists".format(string=string),
                self.alertError.get_value().find(string) != -1
            ))
        return rl