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 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
Beispiel #3
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 #4
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)