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