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)
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())
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
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)
Beispiel #5
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
Beispiel #6
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())
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)
Beispiel #9
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"
        )
Beispiel #10
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
        )
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
Beispiel #12
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
Beispiel #13
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)
Beispiel #14
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)
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=".//input[@value='FlatDHCPManager']",
            element_name="FlatDHCP Manager")

        self.vlan_manager = Radio(
            xpath=".//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=".//div[contains(@class, 'btn-revert-changes')]",
            element_name="Cancel changes"
        )
        self.save_settings = Button(
            xpath=".//div[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))
Beispiel #16
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
Beispiel #17
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
Beispiel #18
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)
Beispiel #19
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)