예제 #1
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)
class NodeHardwareDialog(AbstractDialog):

    BUTTON_NETWORK_CONFIGURATION = "Network Configuration"
    BUTTON_DISK_CONFIGURATION = "Disk Configuration"

    def __init__(self):
        self.accordion_header = HtmlElement(
            xpath="//div[@class='accordion-toggle' "
            "and contains(text(),'{name}')]/p",
            element_name="Accordion header [{name}]")

        AbstractDialog.__init__(self)

    def click_memory(self):
        return self.accordion_header.find(name='memory')

    def click_interfaces(self):
        return self.accordion_header.find(name='interfaces')

    def click_disks(self):
        return self.accordion_header.find(name='disks')

    def click_system(self):
        return self.accordion_header.find(name='system')

    def click_cpu(self):
        return self.accordion_header.find(name='cpu')

    def click_network_configuration(self):
        return self.click_footer_button(self.BUTTON_NETWORK_CONFIGURATION)

    def click_disk_configuration(self):
        return self.click_footer_button(self.BUTTON_DISK_CONFIGURATION)
예제 #3
0
class ConfigureInterfaces(ConfigureView):

    def __init__(self):
        self.interface_box = HtmlElement(
            xpath=".//div[@class='physical-network-box' and "
                  "div[@class='network-box-name']='{name}']",
            element_name="Interface {name}")

        self.interface_drop_area = HtmlElement(
            xpath=".//div[@class='physical-network-box' and "
                  "div[@class='network-box-name']='{name}']//"
                  "div[contains(@class,'ui-sortable')]",
            element_name="Interface {name} drop area")

        self.network_item = HtmlElement(
            xpath=".//div[@class='logical-network-item' and "
                  "div[@class='name']='{name}']",
            element_name="Network item {name}")

        AbstractView.__init__(self)

    def drag_network_to(self, network, interface):
        network_element = self.network_item.find(name=network)
        interface_element = self.interface_drop_area.find(name=interface)
        self._action_bot._drag_and_drop(network_element.get_element(),
                                        interface_element.get_element())
예제 #4
0
    def __init__(self):
        self.disk_box = HtmlElement(
            xpath=".//div[@class='disk-box disk' and "
            "contains(div[@class='disk-box-name pull-left'],'{name}')]",
            element_name="Disk box {name}")

        AbstractView.__init__(self)
예제 #5
0
class Node(AbstractView):
    def __init__(self, parent=None):
        self.name = HtmlElement(
            xpath=".//div[@class='node-name']", element_name="Cluster name")

        self._select = HtmlElement(
            xpath=".//div[@class='node-select']", element_name="Select tick")

        self.status = HtmlElement(
            xpath=".//div[@class='node-status']", element_name="Status")

        self.hardware = HtmlElement(
            xpath=".//div[@class='node-hardware']", element_name="Hardware")

        AbstractView.__init__(self, parent)

    def get_name(self):
        return self.name.get_value()

    def get_status(self):
        return self.status.get_value().strip()

    def is_selected(self):
        return self._select.get_element().is_displayed()

    def select(self):
        if self.is_selected():
            return Result("Node is already selected")
        else:
            return self.name.click()

    def click_hardware(self):
        return self.hardware.click()
예제 #6
0
    def __init__(self, parent=None):
        self.logo = Link(
            xpath=".//div[@class='navigation-bar']//li[@class='product-logo']",
            element_name="Logo")
        self.nodesTotal = HtmlElement(
            xpath=".//div[@class='navigation-bar']//div[@class='statistic']"
            "/div[@class='stat-count'][1]",
            element_name="Nodes total")
        self.nodesUnallocated = HtmlElement(
            xpath=".//div[@class='navigation-bar']//div[@class='statistic']"
            "/div[@class='stat-count'][1]",
            element_name="Nodes unallocated")
        self.notificationsLink = Link(
            xpath=".//div[@class='navigation-bar']"
            "//li[contains(@class, 'notifications')]",
            element_name="Notifications")
        self.openStackEnvironmentsLink = Link(
            xpath=".//div[@class='navigation-bar']"
            "//li[contains(.,'OpenStack Environments')]",
            element_name="OpenStack Environments")
        self.releases = Link(xpath=".//div[@class='navigation-bar']"
                             "//li[contains(.,'Releases')]/a",
                             element_name="Releases")
        self.supportLink = Link(xpath=".//div[@class='navigation-bar']"
                                "//li[contains(.,'OpenStack Support')]",
                                element_name="OpenStack Support")

        AbstractView.__init__(self, parent)
예제 #7
0
    def __init__(self, parent=None):
        self.clusterName = HtmlElement(xpath="./div[@class='cluster-name']",
                                       element_name="Cluster name")
        self.status = HtmlElement(xpath="./div[@class='cluster-status']",
                                  element_name="Status")

        AbstractView.__init__(self, parent)
예제 #8
0
class Cluster_Nodes_ListView(AbstractView):

    xpath_nodes_by_status = ("//div[contains(@class, 'nodebox') and "
                             "contains(./div/div[@class='node-status']/div, "
                             "'{status}')]")

    def __init__(self, parent=None):
        self.node = HtmlElement(
            xpath=".//div[contains(@class, 'nodebox') and "
                  "not(contains(@class, 'nodebox-gradient')) and "
                  ".//div[@class='node-name' and ./div/text()='{name}']]",
            element_name="Node [{name}]"
        )
        AbstractView.__init__(self, parent)

    def _get_nodes(self, xpath):
        nodes = []
        elements = ActionBot().find_elements(By.XPATH, xpath)
        for i, element in enumerate(elements):
            nodes.append(Node(element))
        return nodes

    def _get_nodes_names(self, xpath):
        nodes = self._get_nodes(xpath)
        nodes_names = []
        for i, n in enumerate(nodes):
            nodes_names.append(n.get_name())
        return nodes_names

    def get_nodes(self):
        return self._get_nodes(".//div[contains(@class, 'nodebox')]")

    def get_nodes_by_status(self, status):
        return self._get_nodes(
            Cluster_Nodes_ListView.xpath_nodes_by_status.format(status=status))

    def get_nodes_names_by_status(self, status):
        return self._get_nodes_names(
            Cluster_Nodes_ListView.xpath_nodes_by_status.format(status=status))

    def select_nodes(self, *args):
        rl = ResultList("Select nodes")
        for name in args:
            node = Node(self.node.find(name=name).get_element())
            rl.push(node.select())
        rl.push(self.apply())
        WaitBot().wait_for_disappears(By.XPATH, "//div[contains(@class,'nodes-screen')]")
        WaitBot().wait_for_displays(By.XPATH, "//div[@class='nodes-by-roles-screen']")
        return rl

    def verify_nodes(self, *args):
        rl = ResultList("Verify nodes")
        for name in args:
            rl.push(Result(
                "Node [{name}] exists".format(name=name),
                self.node.find(name=name).is_found()
            ))
        return rl
예제 #9
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
예제 #10
0
    def __init__(self, parent=None):
        self.name = HtmlElement(xpath=".//div[@class='volume-group-name']",
                                element_name="name")

        self.size = HtmlElement(xpath=".//div[@class='volume-group-size']",
                                element_name="name")

        self.close = Link(xpath=".//div[@class='close-btn']",
                          element_name="close")

        BasePage.__init__(self, parent)
예제 #11
0
class Cluster_BrowseView(AbstractView):
    XPATH_ENVIRONMENTS = "//div[@id='content']//div[@class='cluster-list']" \
                         "//a[contains(@class, 'clusterbox') " \
                         "and div[contains(@class, 'cluster-name')]]"

    def __init__(self, parent=None):
        self.environment = HtmlElement(
            xpath="//div[@id='content']//div[@class='cluster-list']"
                  "//a[contains(@class, 'clusterbox') "
                  "and div[contains(@class, 'cluster-name') "
                  "and text()='{name}']]",
            element_name="Environment {name}"
        )

        self.newEnvironment = Link(
            xpath="//div[@id='content']//div[@class='cluster-list']"
                  "//div[contains(@class, 'clusterbox create-cluster')]",
            element_name="New environment")

        AbstractView.__init__(self, parent)
        self.url = "#clusters"

    def get_clusters(self):
        return [Cluster(x) for x in self.get_action_bot().find_elements(
            By.XPATH, self.XPATH_ENVIRONMENTS)]

    def click_add_new_cluster(self, key="cluster"):
        Storage.put(key, TD_Cluster())
        return self.newEnvironment.click_and_wait()

    def remove(self, name):
        rl = ResultList("Delete environment {name}".format(name=name)) \
            .push(self.environment.find(name=name).click_and_wait()) \
            .push(Cluster_View().click_actions_tab()) \
            .push(Cluster_Actions_View().click_delete_cluster_button()) \
            .push(DeleteEnvironmentDialog().delete())
        env = self.environment.find(name=name)
        if env.is_found():
                WaitBot().wait_for_web_element_disappears(env.get_element())
        return rl

    def remove_all(self):
        rl = ResultList("Remove all existing environments")
        for env in self.get_clusters():
            rl.push(self.remove(env.get_name()))
        rl.info("All environments were removed")
        return rl

    def select(self, name):
        return ResultList("Select environment [{}]".format(name)) \
            .push(self.environment.find(name=name).click_and_wait())

    def select_by_key(self, key):
        return self.select(Storage.get(key).name)
예제 #12
0
    def __init__(self, parent=None):
        self.clusterName = HtmlElement(
            xpath="./div[@class='cluster-name']",
            element_name="Cluster name"
        )
        self.status = HtmlElement(
            xpath="./div[@class='cluster-status']",
            element_name="Status"
        )

        AbstractView.__init__(self, parent)
예제 #13
0
class Node(AbstractView):
    def __init__(self, parent=None):
        self.name = HtmlElement(
            xpath=".//div[@class='node-name']//p[@class='node-renameable']",
            element_name="Cluster name"
        )

        self.role = HtmlElement(
            xpath=".//div[@class='roles']//li",
            element_name="Cluster role"
        )

        self._checkbox = Checkbox(
            xpath=".//label[@class='node-checkbox']"
                  "//div[@class='custom-tumbler']/input",
            element_name="Checkbox")

        self.status = HtmlElement(
            xpath=".//div[@class='node-status']", element_name="Status")

        self.details = HtmlElement(
            xpath=".//div[@class='node-details']",
            element_name="Node details icon")

        AbstractView.__init__(self, parent)

    def get_name(self):
        return self.name.get_value()

    def get_status(self):
        return self.status.get_value().strip()

    def is_selected(self):
        return self._checkbox.verify_value("on")

    def verify_checkbox(self, expectedValue):
        return self._checkbox.verify_value(expectedValue)

    def set_checkbox(self, value):
        return self._checkbox.set_value(value)

    def select(self):
        if self.is_selected().i_passed():
            return Result("Node is already selected")
        else:
            return self._checkbox.set_value(Checkbox.VALUE_ON)

    def click_node_details(self):
        return self.details.click()

    def get_roles(self):
        roles_elements = ActionBot().find_elements(
            By.XPATH, ".//div[@class='roles']//li")
        return [HtmlElement(element=we).get_value() for we in roles_elements]
예제 #14
0
 def __init__(self, table):
     self.rows = [
         HtmlElement(element=element)
         for element in self.get_action_bot().find_elements(
             by=By.XPATH, value="./tbody/tr", parent=table
         )
     ]
     self.cell = HtmlElement(
         xpath="./tbody/tr[{row}]/td[{column}]",
         element_name="cell"
     )
     BasePage.__init__(self, parent=table)
예제 #15
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)
예제 #16
0
    def __init__(self, parent=None):
        self.name = HtmlElement(
            xpath=".//div[@class='node-name']", element_name="Cluster name")

        self._select = HtmlElement(
            xpath=".//div[@class='node-select']", element_name="Select tick")

        self.status = HtmlElement(
            xpath=".//div[@class='node-status']", element_name="Status")

        self.hardware = HtmlElement(
            xpath=".//div[@class='node-hardware']", element_name="Hardware")

        AbstractView.__init__(self, parent)
예제 #17
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())
예제 #18
0
class Node(AbstractView):
    def __init__(self, parent=None):
        self.name = HtmlElement(
            xpath=".//div[@class='node-name']//p[@class='node-renameable']",
            element_name="Cluster name")

        self.role = HtmlElement(xpath=".//div[@class='roles']//li",
                                element_name="Cluster role")

        self._checkbox = Checkbox(xpath=".//label[@class='node-checkbox']"
                                  "//div[@class='custom-tumbler']/input",
                                  element_name="Checkbox")

        self.status = HtmlElement(xpath=".//div[@class='node-status']",
                                  element_name="Status")

        self.details = HtmlElement(xpath=".//div[@class='node-details']",
                                   element_name="Node details icon")

        AbstractView.__init__(self, parent)

    def get_name(self):
        return self.name.get_value()

    def get_status(self):
        return self.status.get_value().strip()

    def is_selected(self):
        return self._checkbox.verify_value("on")

    def verify_checkbox(self, expectedValue):
        return self._checkbox.verify_value(expectedValue)

    def set_checkbox(self, value):
        return self._checkbox.set_value(value)

    def select(self):
        if self.is_selected().i_passed():
            return Result("Node is already selected")
        else:
            return self._checkbox.set_value(Checkbox.VALUE_ON)

    def click_node_details(self):
        return self.details.click()

    def get_roles(self):
        roles_elements = ActionBot().find_elements(
            By.XPATH, ".//div[@class='roles']//li")
        return [HtmlElement(element=we).get_value() for we in roles_elements]
예제 #19
0
    def __init__(self, parent=None):
        self.environment = HtmlElement(
            xpath="//div[@id='content']//div[@class='cluster-list']"
                  "//a[contains(@class, 'clusterbox') "
                  "and div[contains(@class, 'cluster-name') "
                  "and text()='{name}']]",
            element_name="Environment {name}"
        )

        self.newEnvironment = Link(
            xpath="//div[@id='content']//div[@class='cluster-list']"
                  "//div[contains(@class, 'clusterbox create-cluster')]",
            element_name="New environment")

        AbstractView.__init__(self, parent)
        self.url = "#clusters"
    def __init__(self):
        self.disk_box = HtmlElement(
            xpath=".//div[@class='disk-box disk' and " "contains(div[@class='disk-box-name pull-left'],'{name}')]",
            element_name="Disk box {name}",
        )

        AbstractView.__init__(self)
class CreateEnvironmentDialog(AbstractDialog):
    def __init__(self):
        self.name = Input(
            xpath=".//input[@name='name']", element_name="Name"
        )
        self.nameErrorMessage = HtmlElement(
            xpath="//div[contains(@class,'control-group') and "
                  ".//input[contains(@name, 'name')]]"
                  "//span[@class='help-inline']",
            element_name="name error message"
        )
        self.version = Select(
            xpath=".//select[@name='release']", element_name="Version"
        )

        AbstractDialog.__init__(self)

    def populate(self, name, version, submit=False):
        environment = Storage.get_current(TD_Cluster.NAME)
        environment.name = name
        environment.version = version

        rl = ResultList("Populate create new Environment dialog") \
            .push(self.name.set_value(name)) \
            .push(self.version.set_value(version))
        if submit:
            rl.push(self.create())
        return rl

    def verify_name_error(self, value):
        return self.nameErrorMessage.verify_value(value)
    def __init__(self):
        self.accordion_header = HtmlElement(
            xpath="//div[@class='accordion-toggle' "
            "and contains(text(),'{name}')]/p",
            element_name="Accordion header [{name}]")

        AbstractDialog.__init__(self)
예제 #23
0
 def __init__(self, parent=None):
     self.node = HtmlElement(
         xpath=".//div[(@class='node' or @class='node checked') and "
               ".//div[@class='node-name' and .//div//text()='{name}']]",
         element_name="Node [{name}]"
     )
     AbstractView.__init__(self, parent)
예제 #24
0
 def __init__(self, parent=None):
     self.node = HtmlElement(
         xpath=".//div[contains(@class, 'nodebox') and "
               "not(contains(@class, 'nodebox-gradient')) and "
               ".//div[@class='node-name' and ./div/text()='{name}']]",
         element_name="Node [{name}]"
     )
     AbstractView.__init__(self, parent)
예제 #25
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)
예제 #26
0
    def __init__(self):
        self.interface_box = HtmlElement(
            xpath=".//div[@class='physical-network-box' and "
                  "div[@class='network-box-name']='{name}']",
            element_name="Interface {name}")

        self.interface_drop_area = HtmlElement(
            xpath=".//div[@class='physical-network-box' and "
                  "div[@class='network-box-name']='{name}']//"
                  "div[contains(@class,'ui-sortable')]",
            element_name="Interface {name} drop area")

        self.network_item = HtmlElement(
            xpath=".//div[@class='logical-network-item' and "
                  "div[@class='name']='{name}']",
            element_name="Network item {name}")

        AbstractView.__init__(self)
예제 #27
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)
예제 #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[.//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)
예제 #29
0
class ConfigureDisks(ConfigureView):
    def __init__(self):
        self.disk_box = HtmlElement(
            xpath=".//div[@class='disk-box disk' and "
            "contains(div[@class='disk-box-name pull-left'],'{name}')]",
            element_name="Disk box {name}")

        AbstractView.__init__(self)

    def get_disk_box(self, name):
        return DiskBox(self.disk_box.find(name=name).get_element())
class ConfigureDisks(ConfigureView):
    def __init__(self):
        self.disk_box = HtmlElement(
            xpath=".//div[@class='disk-box disk' and " "contains(div[@class='disk-box-name pull-left'],'{name}')]",
            element_name="Disk box {name}",
        )

        AbstractView.__init__(self)

    def get_disk_box(self, name):
        return DiskBox(self.disk_box.find(name=name).get_element())
예제 #31
0
class Cluster(AbstractView):
    DEPLOYMENT_MODE_MULTI_NODE = "Multi-node"
    DEPLOYMENT_MODE_MULTI_NODE_WITH_HA = "Multi-node with HA"

    def __init__(self, parent=None):
        self.clusterName = HtmlElement(xpath="./div[@class='cluster-name']",
                                       element_name="Cluster name")
        self.status = HtmlElement(xpath="./div[@class='cluster-status']",
                                  element_name="Status")

        AbstractView.__init__(self, parent)

    def get_name(self):
        return self.clusterName.get_value()

    def get_status(self):
        return self.status.get_value().strip()

    def verify_status(self, status):
        return self.get_status().verify_value(status)
예제 #32
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)
예제 #33
0
class Cluster(AbstractView):
    DEPLOYMENT_MODE_MULTI_NODE = "Multi-node"
    DEPLOYMENT_MODE_MULTI_NODE_WITH_HA = "Multi-node with HA"

    def __init__(self, parent=None):
        self.clusterName = HtmlElement(
            xpath="./div[@class='cluster-name']",
            element_name="Cluster name"
        )
        self.status = HtmlElement(
            xpath="./div[@class='cluster-status']",
            element_name="Status"
        )

        AbstractView.__init__(self, parent)

    def get_name(self):
        return self.clusterName.get_value()

    def get_status(self):
        return self.status.get_value().strip()
예제 #34
0
    def __init__(self, parent=None):
        self.name = HtmlElement(xpath=".//div[@class='volume-group-box-name']",
                                element_name="name")

        self.size = Input(
            xpath=".//div[@class='volume-group-box-input']/input",
            element_name="size")

        self.use_all_unallocated = Link(
            xpath=".//div[@class='use-all-unallocated']",
            element_name="Use all unallocated")

        BasePage.__init__(self, parent)
예제 #35
0
    def __init__(self, parent=None):
        self.name = HtmlElement(
            xpath=".//div[@class='node-name']//p[@class='node-renameable']",
            element_name="Cluster name"
        )

        self.role = HtmlElement(
            xpath=".//div[@class='roles']//li",
            element_name="Cluster role"
        )

        self._checkbox = Checkbox(
            xpath=".//label[@class='node-checkbox']"
                  "//div[@class='custom-tumbler']/input",
            element_name="Checkbox")

        self.status = HtmlElement(
            xpath=".//div[@class='node-status']", element_name="Status")

        self.details = HtmlElement(
            xpath=".//div[@class='node-details']",
            element_name="Node details icon")

        AbstractView.__init__(self, parent)
    def __init__(self):
        self.name = Input(
            xpath=".//input[@name='name']", element_name="Name"
        )
        self.nameErrorMessage = HtmlElement(
            xpath="//div[contains(@class,'control-group') and "
                  ".//input[contains(@name, 'name')]]"
                  "//span[@class='help-inline']",
            element_name="name error message"
        )
        self.version = Select(
            xpath=".//select[@name='release']", element_name="Version"
        )

        AbstractDialog.__init__(self)
예제 #37
0
    def __init__(self, parent=None):
        self.environment = HtmlElement(
            xpath="//div[@id='content']//div[@class='cluster-list']"
                  "//a[contains(@class, 'clusterbox') "
                  "and div[contains(@class, 'cluster-name') "
                  "and text()='{name}']]",
            element_name="Environment {name}"
        )

        self.newEnvironment = Link(
            xpath="//div[@id='content']//div[@class='cluster-list']"
                  "//div[contains(@class, 'clusterbox create-cluster')]",
            element_name="New environment")

        AbstractView.__init__(self, parent)
        self.url = "#clusters"
예제 #38
0
    def __init__(self, parent=None):
        self.name = HtmlElement(
            xpath=".//div[@class='node-name']//p[@class='node-renameable']",
            element_name="Cluster name")

        self.role = HtmlElement(xpath=".//div[@class='roles']//li",
                                element_name="Cluster role")

        self._checkbox = Checkbox(xpath=".//label[@class='node-checkbox']"
                                  "//div[@class='custom-tumbler']/input",
                                  element_name="Checkbox")

        self.status = HtmlElement(xpath=".//div[@class='node-status']",
                                  element_name="Status")

        self.details = HtmlElement(xpath=".//div[@class='node-details']",
                                   element_name="Node details icon")

        AbstractView.__init__(self, parent)
예제 #39
0
class Table(BasePage):
    def __init__(self, table):
        self.rows = [
            HtmlElement(element=element)
            for element in self.get_action_bot().find_elements(
                by=By.XPATH, value="./tbody/tr", parent=table
            )
        ]
        self.cell = HtmlElement(
            xpath="./tbody/tr[{row}]/td[{column}]",
            element_name="cell"
        )
        BasePage.__init__(self, parent=table)

    def get_rows_count(self):
        return len(self.rows)

    def get_value(self, row, column):
        return self.cell.find(
            row=row,
            column=column
        ).get_value()

    def get_row(self, column, name):
        for i in range(1, self.get_rows_count() + 1):
            if self.get_value(i, column) == name:
                return i
        raise TestExecutionRuntimeException(
            "Row not found with column [{id}] equals to [{name}]".format(
                name=name, id=column
            )
        )

    def verify_value(self, row, column, value):
        return self.get_verify_bot().verify_contains(
            value,
            self.get_value(row, column),
            "row: {row}, column: {column}".format(row=row, column=column),
            "table cell"
        )
예제 #40
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)
예제 #41
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)
예제 #42
0
class NetworkSettingsView(AbstractView):
    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)

    def get_ip_range_row(self, name, num):
        return IpRangeRow(self.ip_range_row.find(name=name, num=num))

    def verify_error(self,
                     obj,
                     args,
                     value,
                     error_class="error",
                     simple_class=""):
        rl = ResultList(
            "Set '{args}' and verify validation".format(args=args)).\
            push(obj.set_value(args))
        if value:
            rl.push(obj.verify_attribute("class", simple_class))
        else:
            rl.push(obj.verify_attribute("class", error_class))
        return rl

    def verify_cidr_vm_networks(self, args, value):
        return self.verify_error(self.vm_networks_cidr, args, value)

    def verify_amount(self, args, value):
        return self.verify_error(self.vm_networks_number_of_networks, args,
                                 value, "range error", "range")

    def verify_vlan_id_range_start(self, args, value):
        return self.verify_error(self.vm_networks_vlan_id_range_start, args,
                                 value, "mini range error", "mini range")

    def verify_error_amount(self,
                            arg_number,
                            value,
                            arg_start_range=1,
                            arg_end_range=None):
        rl = ResultList("Verify validation of field number of networks"
                        " with value '{args}'".format(args=arg_number))
        rl.push(
            self.vm_networks_vlan_id_range_start.set_value(arg_start_range))
        rl.push(self.verify_amount(arg_number, value))
        if arg_end_range is not None:
            rl.push(
                self.vm_networks_vlan_id_range_end.verify_value(arg_end_range))
        return rl

    def set_flatDHCP_manager(self, value):
        return self.flat_dhcp_manager.set_value(value)

    def set_VLAN_manager(self, value):
        return self.vlan_manager.set_value(value)

    def verify_flatDHCP_manager_value(self, value):
        return self.flat_dhcp_manager.verify_value(value)

    def verify_VLAN_manager_value(self, value):
        return self.vlan_manager.verify_value(value)

    def get_networks_blocks(self):
        return self.get_action_bot().find_elements(
            By.XPATH, ".//div/legend[@class='networks']")

    def verify_amount_of_blocks(self, expected_amount):
        status = len(self.get_networks_blocks()) == expected_amount
        return Result(
            "Amount of blocks is {amount}. Amount is equal "
            "with expected: {status}".format(amount=len(
                self.get_networks_blocks()),
                                             status=status), status)

    def verify_visibility_vlan_manager_fields(self, value):
        rl = ResultList("Verify vlan manager fields "
                        "are visible: {value}".format(value=value))
        rl.push(VerifyBot().verify_visibility(
            NetworkSettingsView().vm_networks_number_of_networks.get_element(),
            value, "Number of networks"))
        rl.push(VerifyBot().verify_visibility(
            NetworkSettingsView().vm_networks_size_of_networks.get_element(),
            value, "Size of networks"))
        if value:
            rl.push(VerifyBot().verify_visibility(
                NetworkSettingsView().vm_networks_vlan_id_range_start.
                get_element(), value, "Start of VLAN ID range"))
            rl.push(VerifyBot().verify_visibility(
                NetworkSettingsView().vm_networks_vlan_id_range_end.
                get_element(), value, "End of VLAN ID range"))
        else:
            rl.push(VerifyBot().verify_visibility(
                NetworkSettingsView().vm_networks_vlan_id_range_start, value,
                "Start of VLAN ID range"))
            rl.push(VerifyBot().verify_visibility(
                NetworkSettingsView().vm_networks_vlan_id_range_end, value,
                "End of VLAN ID range"))
        return rl
예제 #43
0
    def __init__(self):
        AbstractDialog.__init__(self)

        self.alert_message = HtmlElement(
            xpath=".//div[@class='alert alert-error']",
            element_name="Alert error message")
예제 #44
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)
예제 #45
0
class DiskBox(BasePage):
    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)

    def get_volume_group(self, name):
        return VolumeGroup(self.volume_group.find(name=name))

    def get_volume_group_box(self, name):
        return VolumeGroupBox(self.volume_group_box.find(name=name))

    def click_disk_map(self):
        rl = ResultList("Click disk map")
        rl.push(self.disk_map.click())
        WaitBot().wait_for_web_element_stop_resizing(
            self.disk_map.find().get_element())
        return rl

    def verify_volume_size_is_identical(self, name):
        rl = ResultList("Verify volume size is identical everywhere")
        group_box_size = self.get_volume_group_box(name).size.get_value()
        rl.push(self.get_volume_group(name).size.verify_value_contains(
            group_box_size))
        return rl
    def __init__(self):

        self.activationKey = Input(
            xpath=".//input[@name='activation_key']",
            element_name="Activation key"
        )
        self.deploymentMode = Radio(
            xpath=".//div[contains(@class, 'mode-control-group')]"
            "//label[div[contains(@class, 'parameter-name') "
            "and text()='{mode}']]",
            element_name="Deployment mode [{mode}]"
        )
        self.downloadType = Radio(
            xpath=".//div[contains(@class, 'custom-tumbler') "
                  "and input[@type='radio' and @value='{type}']]",
            element_name="Download type [{type}]"
        )
        self.instruction = HtmlElement(
            xpath=".//div[@class='alert alert-info rhel-license hide']",
            element_name="Instruction to deploy RHOS"
        )
        self.message_configuration_ready = HtmlElement(
            xpath=".//div[contains(text(), 'Configuration is finished and "
                  "now you can create your cluster!')]",
            element_name="Message: ready to create environment"
        )
        self.name = Input(
            xpath=".//input[@name='name']", element_name="Name"
        )
        self.nameErrorMessage = HtmlElement(
            xpath="//div[contains(@class,'control-group') and "
                  ".//input[contains(@name, 'name')]]"
                  "//span[@class='help-inline']",
            element_name="name error message"
        )
        self.parameter_radio = Radio(
            xpath=".//label[contains(@class,'parameter-box') and "
                  "div[contains(@class,'parameter-name')]/text()='{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.password = Input(
            xpath=".//input[@name='password']",
            element_name="Password"
        )
        self.releaseDescription = HtmlElement(
            xpath=".//div[@class='release-description help-block']",
            element_name="Release description"
        )
        self.serverHostname = Input(
            xpath=".//input[@name='satellite']",
            element_name="Satellite server hostname"
        )
        self.storage_cinder = Radio(
            xpath=".//div[contains(@class, 'span6') and contains(./h5/text(), "
                  "'Cinder backend')]//label[contains(@class,'parameter-box') "
                  "and div[contains(@class,'parameter-name')]"
                  "/text()='{name}']",
            element_name="Cinder backend {name}"
        )
        self.storage_glance = Radio(
            xpath=".//div[contains(@class, 'span6') and contains(./h5/text(), "
                  "'Glance backend')]//label[contains(@class,'parameter-box') "
                  "and div[contains(@class,'parameter-name')]"
                  "/text()='{name}']",
            element_name="Glance backend {name}"
        )
        self.username = Input(
            xpath=".//input[@name='username']",
            element_name="Username"
        )
        self.version = Select(
            xpath=".//select[@name='release']", element_name="Version"
        )

        AbstractDialog.__init__(self)
class CreateEnvironmentDialog(AbstractDialog):

    def __init__(self):

        self.activationKey = Input(
            xpath=".//input[@name='activation_key']",
            element_name="Activation key"
        )
        self.deploymentMode = Radio(
            xpath=".//div[contains(@class, 'mode-control-group')]"
            "//label[div[contains(@class, 'parameter-name') "
            "and text()='{mode}']]",
            element_name="Deployment mode [{mode}]"
        )
        self.downloadType = Radio(
            xpath=".//div[contains(@class, 'custom-tumbler') "
                  "and input[@type='radio' and @value='{type}']]",
            element_name="Download type [{type}]"
        )
        self.instruction = HtmlElement(
            xpath=".//div[@class='alert alert-info rhel-license hide']",
            element_name="Instruction to deploy RHOS"
        )
        self.message_configuration_ready = HtmlElement(
            xpath=".//div[contains(text(), 'Configuration is finished and "
                  "now you can create your cluster!')]",
            element_name="Message: ready to create environment"
        )
        self.name = Input(
            xpath=".//input[@name='name']", element_name="Name"
        )
        self.nameErrorMessage = HtmlElement(
            xpath="//div[contains(@class,'control-group') and "
                  ".//input[contains(@name, 'name')]]"
                  "//span[@class='help-inline']",
            element_name="name error message"
        )
        self.parameter_radio = Radio(
            xpath=".//label[contains(@class,'parameter-box') and "
                  "div[contains(@class,'parameter-name')]/text()='{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.password = Input(
            xpath=".//input[@name='password']",
            element_name="Password"
        )
        self.releaseDescription = HtmlElement(
            xpath=".//div[@class='release-description help-block']",
            element_name="Release description"
        )
        self.serverHostname = Input(
            xpath=".//input[@name='satellite']",
            element_name="Satellite server hostname"
        )
        self.storage_cinder = Radio(
            xpath=".//div[contains(@class, 'span6') and contains(./h5/text(), "
                  "'Cinder backend')]//label[contains(@class,'parameter-box') "
                  "and div[contains(@class,'parameter-name')]"
                  "/text()='{name}']",
            element_name="Cinder backend {name}"
        )
        self.storage_glance = Radio(
            xpath=".//div[contains(@class, 'span6') and contains(./h5/text(), "
                  "'Glance backend')]//label[contains(@class,'parameter-box') "
                  "and div[contains(@class,'parameter-name')]"
                  "/text()='{name}']",
            element_name="Glance backend {name}"
        )
        self.username = Input(
            xpath=".//input[@name='username']",
            element_name="Username"
        )
        self.version = Select(
            xpath=".//select[@name='release']", element_name="Version"
        )

        AbstractDialog.__init__(self)

    def select_deployment_mode(self, value):
        return self.deploymentMode.find(mode=value).click()

    def populate(self, settings, clickNext=False):
        environment = Storage.get_current(TD_Cluster.NAME)
        environment.name = settings["name"]
        environment.version = settings["version"]

        rl = ResultList("Populate create new Environment dialog")

        rl.push(self.name.set_value(settings["name"]))
        rl.push(WaitBot().wait_loading())
        rl.push(self.version.set_value(settings["version"]))
        rl.push(self.name.click())

        if "rh" in settings and len(settings["rh"]) > 0 and \
                self.instruction.is_visible():

            rh = settings["rh"]
            self.wait_loading()
            rl.push(self.select_download_mode(rh["mode"]))
            rl.push(self.username.set_value(rh["username"]))
            rl.push(self.password.set_value(rh["password"]))

            if rh["mode"] == 'rhn':
                rl.push(self.serverHostname.set_value(rh["host"]))
                rl.push(self.activationKey.set_value(rh["activation_key"]))

        if clickNext:
            self.wait_loading()
            rl.push(self.clickNext())
            WaitBot().wait_loading()

        return rl

    def verify_name_error(self, value):
        return self.nameErrorMessage.verify_value(value)

    def verify_release_description(self, value):
        return self.releaseDescription.verify_value_contains(value)

    def select_download_mode(self, value):
        return self.downloadType.find(type=value).set_value("on")

    def set_parameter_radio(self, name, value):
        return self.parameter_radio.find(name=name).set_value(value)

    def set_parameter_checkbox(self, name, value):
        return self.parameter_checkbox.find(name=name).set_value(value)

    def create_environment(self, settings):
        """
        :param settings: {
            "name": "",
            "version": "",
            "rh": {
                "mode": "",
                "username": "",
                "password": "",
                "host": "",
                "activation_key": ""
            },
            "deployment_mode": "",
            "compute_type": "",
            "network": "",
            "storage": {
                "cinder": "",
                "glance": ""
            },
            "services":{
                "savanna": True,
                "murano": True
            }
        }
        """
        rl = ResultList("Create new environment")

        rl.push(self.populate(settings, True))

        rl.push(self.select_deployment_mode(settings["deployment_mode"]))
        rl.push(self.clickNext(()))

        #Set compute type (hypervisor)
        if "compute_type" in settings:
            rl.push(self.set_parameter_radio(
                settings["compute_type"], Radio.VALUE_ON))
        rl.push(self.clickNext())

        # Set network type
        if "network" in settings:
            rl.push(self.set_parameter_radio(
                settings["network"], Radio.VALUE_ON))
        rl.push(self.clickNext())

        if "storage" in settings:
            storage = settings["storage"]
            # Set cinder backend
            if "cinder" in storage:
                rl.push(
                    self.storage_cinder.find(storage["cinder"])
                    .set_value(Radio.VALUE_ON))

            # Set glance backend
            if "glance" in storage:
                rl.push(
                    self.storage_glance.find(storage["glance"])
                    .set_value(Radio.VALUE_ON))
        rl.push(self.clickNext())

        if "services" in settings:
            services = settings["services"]
            if "savanna" in services and services["savanna"]:
                rl.push(self.set_parameter_checkbox(
                    "Install Savanna", Checkbox.VALUE_ON))
            if "murano" in services and services["murano"]:
                rl.push(self.set_parameter_checkbox(
                    "Install Murano", Checkbox.VALUE_ON))
        rl.push(self.clickNext())

        rl.push(self.create())
        return rl
예제 #48
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)
예제 #49
0
class DiskBox(BasePage):
    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)

    def get_volume_group(self, name):
        return VolumeGroup(self.volume_group.find(name=name).get_element())

    def get_volume_group_box(self, name):
        return VolumeGroupBox(
            self.volume_group_box.find(name=name).get_element())

    def click_disk_map(self):
        rl = ResultList("Click disk map")
        rl.push(self.disk_map.click())
        WaitBot().wait_for_web_element_stop_resizing(
            self.disk_map.find().get_element())
        return rl

    def verify_volume_size_is_identical(self, name):
        rl = ResultList("Verify volume size is identical everywhere")
        group_box_size = self.get_volume_group_box(name).size.get_value()
        group_box_size = group_box_size.encode().replace(' ', '')
        group_box_size = group_box_size.encode().replace(',', '')
        group_box_size = float(group_box_size)
        if (group_box_size > 1024.0):
            group_box_size = group_box_size / 1024.0
            if (group_box_size > 256.0):
                group_box_size = group_box_size / 1024.0
        group_box_size = round(group_box_size, 1)
        if self.get_volume_group(name).size.get_value().encode() != "":
            rl.push(
                self.get_volume_group(name).size.verify_value_contains(
                    str(group_box_size)))
        return rl
예제 #50
0
class Cluster_BrowseView(AbstractView):
    XPATH_ENVIRONMENTS = "//div[@id='content']//div[@class='cluster-list']" \
                         "//a[contains(@class, 'clusterbox') " \
                         "and div[contains(@class, 'cluster-name')]]"

    def __init__(self, parent=None):
        self.environment = HtmlElement(
            xpath="//div[@id='content']//div[@class='cluster-list']"
                  "//a[contains(@class, 'clusterbox') "
                  "and div[contains(@class, 'cluster-name') "
                  "and text()='{name}']]",
            element_name="Environment {name}"
        )

        self.newEnvironment = Link(
            xpath="//div[@id='content']//div[@class='cluster-list']"
                  "//div[contains(@class, 'clusterbox create-cluster')]",
            element_name="New environment")

        AbstractView.__init__(self, parent)
        self.url = "#clusters"

    def get_clusters(self):
        return [Cluster(x) for x in self.get_action_bot().find_elements(
            By.XPATH, self.XPATH_ENVIRONMENTS)]

    def click_add_new_cluster(self, key="cluster"):
        Storage.put(key, TD_Cluster())
        return self.newEnvironment.click_and_wait()

    def remove(self, name):
        rl = ResultList("Delete environment {name}".format(name=name)) \
            .push(self.environment.find(name=name).click_and_wait()) \
            .push(Cluster_View().click_actions_tab()) \
            .push(Cluster_Actions_View().click_delete_cluster_button()) \
            .push(DeleteEnvironmentDialog().delete())
        env = self.environment.find(name=name)
        if env.is_found():
                WaitBot().wait_for_web_element_disappears(env.get_element())
        return rl

    def remove_all(self):
        rl = ResultList("Remove all existing environments")
        _list = []
        for env in self.get_clusters():
            _list.append(env.get_name())
        rl.info("There is(are) {} environments to remove. Names: {}".format(
            len(_list), str(_list)
        ))
        for name in _list:
            rl.push(self.remove(name))
        rl.info("All environments were removed")
        return rl

    def select(self, name):
        rl = ResultList("Select environment [{}]".format(name))
        rl.push(self.environment.find(name=name).click_and_wait())
        rl.push(self.get_wait_bot().wait_for_time(2))
        return rl

    def select_by_key(self, key):
        return self.select(Storage.get(key).name)

    def verify_clusters_amount(self, value):
        return Result(
            "Verify if amount of clusters is {value}"
            .format(value=value),
            len(self.get_clusters()) == value
        )
예제 #51
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)
예제 #52
0
 def __init__(self, parent=None):
     self.node = HtmlElement(
         xpath=".//div[(@class='node' or @class='node checked') and "
         ".//div[@class='node-name' and .//div//text()='{name}']]",
         element_name="Node [{name}]")
     AbstractView.__init__(self, parent)
예제 #53
0
class Cluster_Nodes_ListView(AbstractView):

    xpath_nodes_by_status = \
        "//div[(@class='node' or @class='node checked') and contains(" \
        ".//div[@class='node-status']/div, '{status}')]"

    def __init__(self, parent=None):
        self.node = HtmlElement(
            xpath=".//div[(@class='node' or @class='node checked') and "
            ".//div[@class='node-name' and .//div//text()='{name}']]",
            element_name="Node [{name}]")
        AbstractView.__init__(self, parent)

    def _get_nodes(self, xpath):
        nodes = []
        elements = ActionBot().find_elements(By.XPATH, xpath, self._parent)
        for i, element in enumerate(elements):
            nodes.append(Node(element))
        return nodes

    def _get_nodes_names(self, xpath):
        nodes = self._get_nodes(xpath)
        nodes_names = []
        for i, n in enumerate(nodes):
            nodes_names.append(n.get_name())
        return nodes_names

    def get_nodes(self):
        return self._get_nodes(".//div[contains(@class,'node-box')]")

    def get_nodes_by_status(self, status):
        return self._get_nodes(
            Cluster_Nodes_ListView.xpath_nodes_by_status.format(status=status))

    def get_nodes_names_by_status(self, status):
        return self._get_nodes_names(
            self.xpath_nodes_by_status.format(status=status))

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

    def verify_nodes(self, *args):
        rl = ResultList("Verify nodes")
        for name in args:
            rl.push(
                Result("Node [{name}] exists".format(name=name),
                       self.node.find(name=name).is_found()))
        return rl

    def verify_nodes_not_exist(self, *args):
        rl = ResultList("Verify nodes not exist")
        for name in args:
            rl.push(
                Result("Node [{name}] not exists".format(name=name),
                       self.node.find(name=name).is_not_found()))
        return rl

    def verify_amount_nodes_in_status(self, status, value):
        return Result(
            "Verify if amount of nodes in {status} is {value}".format(
                status=status, value=value),
            len(self.get_nodes_names_by_status(status)) == value)
예제 #54
0
 def get_roles(self):
     roles_elements = ActionBot().find_elements(
         By.XPATH, ".//div[@class='roles']//li")
     return [HtmlElement(element=we).get_value() for we in roles_elements]