murano-tests/muranodashboard-tests/base.py

533 lines
22 KiB
Python

import testtools
import ConfigParser
import random
import time
import json
import datetime
import os
import logging
log = logging.getLogger(__name__)
log.setLevel(logging.DEBUG)
log.addHandler(logging.StreamHandler())
from selenium import webdriver
import selenium.webdriver.common.by as by
import config.config as cfg
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from selenium.webdriver.support.ui import WebDriverWait
from keystoneclient.v2_0 import client as ksclient
from muranoclient.client import Client as mclient
from glanceclient import Client as gclient
class ImageException(Exception):
message = "Image doesn't exist"
def __init__(self, type):
self._error_string = self.message + '\nDetails: %s' \
' image is not found,' % str(type)
def __str__(self):
return self._error_string
class UITestCase(testtools.TestCase):
@classmethod
def setUpClass(cls):
super(UITestCase, cls).setUpClass()
keystone_client = ksclient.Client(username=cfg.common.user,
password=cfg.common.password,
tenant_name=cfg.common.tenant,
auth_url=cfg.common.keystone_url)
cls.murano_client = mclient('1', endpoint=cfg.common.murano_url,
token=keystone_client.auth_token)
glance_endpoint = keystone_client.service_catalog.url_for(
service_type='image', endpoint_type='publicURL')
glance = gclient('1', endpoint=glance_endpoint,
token=keystone_client.auth_token)
image_list = []
for i in glance.images.list():
image_list.append(i)
cls.demo_image = cls.get_image_name('demo', image_list)
cls.linux_image = cls.get_image_name('linux', image_list)
cls.windows_image = cls.get_image_name('windows', image_list)
cls.keypair = cfg.common.keypair_name
cls.asp_git_repository = cfg.common.asp_git_repository
cls.elements = ConfigParser.RawConfigParser()
cls.elements.read('common.ini')
cls.logger = logging.getLogger(__name__)
def setUp(self):
super(UITestCase, self).setUp()
self.driver = webdriver.Remote(
command_executor=cfg.common.selenium_server,
desired_capabilities=DesiredCapabilities.FIREFOX)
self.driver.get(cfg.common.horizon_url + '/')
self.driver.implicitly_wait(10)
def tearDown(self):
super(UITestCase, self).tearDown()
self.addOnException(self.take_screenshot(self._testMethodName))
self.driver.quit()
for env in self.murano_client.environments.list():
self.murano_client.environments.delete(env.id)
def take_screenshot(self, test_name):
screenshot_dir = './screenshots'
if not os.path.exists(screenshot_dir):
os.makedirs(screenshot_dir)
date = datetime.datetime.now().strftime('%H%M%S')
filename = '%s/%s-%s.png' % (
screenshot_dir, test_name, date)
self.driver.get_screenshot_as_file(filename)
log.debug("\nScreenshot {0} was saved".format(filename))
@classmethod
def get_image_name(cls, type_of_image, list_of_images):
for i in list_of_images:
if 'murano_image_info' in i.properties.keys():
if type_of_image in json.loads(
i.properties['murano_image_info'])['type']:
return json.loads(i.properties[
'murano_image_info'])['title']
raise ImageException(type_of_image)
def log_in(self):
self.fill_field(by.By.ID, 'id_username', cfg.common.user)
self.fill_field(by.By.ID, 'id_password', cfg.common.password)
sign_in = self.elements.get('button', 'ButtonSubmit')
self.driver.find_element_by_xpath(sign_in).click()
self.navigate_to_environments()
def fill_field(self, by_find, field, value):
self.driver.find_element(by=by_find, value=field).clear()
self.driver.find_element(by=by_find, value=field).send_keys(value)
def confirm_deletion(self):
confirm_deletion = self.elements.get('button', 'ConfirmDeletion')
self.driver.find_element_by_xpath(confirm_deletion).click()
def create_environment(self, env_name):
self.driver.find_element_by_id(
'murano__action_CreateEnvironment').click()
self.fill_field(by.By.ID, 'id_name', env_name)
create = self.elements.get('button', 'InputSubmit')
self.driver.find_element_by_xpath(create).click()
def delete_environment(self, env_name):
self.driver.find_element_by_link_text('Environments').click()
self.click_on_more(env_name)
self.click_on_delete(env_name)
self.confirm_deletion()
def edit_environment(self, old_name, new_name):
self.click_on_more(old_name)
self.click_on_edit(old_name)
self.fill_field(by.By.ID, 'id_name', new_name)
save = self.elements.get('button', 'InputSubmit')
self.driver.find_element_by_xpath(save).click()
def click_on_more(self, env_name):
element_id = self.get_element_id(env_name)
self.driver.find_element_by_xpath(
".//*[@id='murano__row__%s']/td[4]/div/a[2]" % element_id).click()
def click_on_edit(self, env_name):
element_id = self.get_element_id(env_name)
self.driver.find_element_by_id(
"murano__row_%s__action_edit" % element_id).click()
def click_on_delete(self, env_name):
element_id = self.get_element_id(env_name)
self.driver.find_element_by_id(
"murano__row_%s__action_delete" % element_id).click()
def navigate_to_environments(self):
self.driver.find_element_by_link_text('Murano').click()
self.driver.find_element_by_link_text('Environments').click()
def navigate_to_images(self):
self.driver.find_element_by_link_text('Murano').click()
self.driver.find_element_by_link_text('Images').click()
def select_from_list(self, list_name, value):
self.driver.find_element_by_xpath(
"//select[@name='%s']/option[text()='%s']" %
(list_name, value)).click()
def check_element_on_page(self, method, value):
try:
self.driver.find_element(method, value)
except NoSuchElementException:
return False
return True
def env_to_service(self, env_name):
element_id = self.get_element_id(env_name)
self.driver.find_element_by_id("murano__row_%s__action_show"
% element_id).click()
def create_demo_service(self, service_name):
self.driver.find_element_by_id(
'services__action_CreateService').click()
self.select_from_list('service_choice-service', 'Demo Service')
next_button = self.elements.get('button', 'Next')
self.driver.find_element_by_xpath(next_button).click()
self.fill_field(by.By.ID, 'id_demoService-0-name', service_name)
next_button = self.elements.get('button', 'Next2')
self.driver.find_element_by_xpath(next_button).click()
self.select_from_list('demoService-1-osImage', self.demo_image)
next_button = self.elements.get('button', 'Create')
self.driver.find_element_by_xpath(next_button).click()
def create_linux_telnet(self, service_name):
self.driver.find_element_by_id(
'services__action_CreateService').click()
self.select_from_list('service_choice-service', 'Linux Telnet')
next_button = self.elements.get('button', 'Next')
self.driver.find_element_by_xpath(next_button).click()
self.fill_field(by.By.ID, 'id_linuxTelnetService-0-name',
service_name)
next_button = self.elements.get('button', 'Next2')
self.driver.find_element_by_xpath(next_button).click()
self.select_from_list('linuxTelnetService-1-osImage',
self.linux_image)
self.select_from_list('linuxTelnetService-1-keyPair',
self.keypair)
next_button = self.elements.get('button', 'Create')
self.driver.find_element_by_xpath(next_button).click()
def create_linux_apache(self, service_name):
self.driver.find_element_by_id(
'services__action_CreateService').click()
self.select_from_list('service_choice-service', 'Linux Apache')
next_button = self.elements.get('button', 'Next')
self.driver.find_element_by_xpath(next_button).click()
self.fill_field(by.By.ID, 'id_linuxApacheService-0-name', service_name)
next_button = self.elements.get('button', 'Next2')
self.driver.find_element_by_xpath(next_button).click()
self.select_from_list('linuxApacheService-1-osImage',
self.linux_image)
self.select_from_list('linuxApacheService-1-keyPair',
self.keypair)
next_button = self.elements.get('button', 'Create')
self.driver.find_element_by_xpath(next_button).click()
def create_ad_service(self, service_name):
self.driver.find_element_by_id(
'services__action_CreateService').click()
self.select_from_list('service_choice-service', 'Active Directory')
next_button = self.elements.get('button', 'Next')
self.driver.find_element_by_xpath(next_button).click()
self.fill_field(
by.By.ID, 'id_activeDirectory-0-name', service_name)
self.fill_field(
by.By.ID, 'id_activeDirectory-0-adminPassword', 'P@ssw0rd')
self.fill_field(
by.By.ID, 'id_activeDirectory-0-adminPassword-clone', 'P@ssw0rd')
self.fill_field(
by.By.ID, 'id_activeDirectory-0-recoveryPassword', 'P@ssw0rd')
self.fill_field(
by.By.ID,
'id_activeDirectory-0-recoveryPassword-clone', 'P@ssw0rd')
next_button = self.elements.get('button', 'Next2')
self.driver.find_element_by_xpath(next_button).click()
self.select_from_list('activeDirectory-1-osImage', self.windows_image)
next_button = self.elements.get('button', 'Create')
self.driver.find_element_by_xpath(next_button).click()
def create_iis_service(self, service_name):
self.driver.find_element_by_id(
'services__action_CreateService').click()
self.select_from_list(
'service_choice-service', 'Internet Information Services')
next_button = self.elements.get('button', 'Next')
self.driver.find_element_by_xpath(next_button).click()
self.fill_field(by.By.ID, 'id_webServer-0-name', service_name)
self.fill_field(
by.By.ID, 'id_webServer-0-adminPassword', 'P@ssw0rd')
self.fill_field(
by.By.ID, 'id_webServer-0-adminPassword-clone', 'P@ssw0rd')
next_button = self.elements.get('button', 'Next2')
self.driver.find_element_by_xpath(next_button).click()
self.select_from_list('webServer-1-osImage', self.windows_image)
next_button = self.elements.get('button', 'Create')
self.driver.find_element_by_xpath(next_button).click()
def create_asp_service(self, service_name):
self.driver.find_element_by_id(
'services__action_CreateService').click()
self.select_from_list('service_choice-service', 'ASP.NET Application')
next_button = self.elements.get('button', 'Next')
self.driver.find_element_by_xpath(next_button).click()
self.fill_field(by.By.ID, 'id_aspNetApp-0-name', service_name)
self.fill_field(
by.By.ID, 'id_aspNetApp-0-adminPassword', 'P@ssw0rd')
self.fill_field(
by.By.ID, 'id_aspNetApp-0-adminPassword-clone', 'P@ssw0rd')
self.fill_field(
by.By.ID, 'id_aspNetApp-0-repository', self.asp_git_repository)
next_button = self.elements.get('button', 'Next2')
self.driver.find_element_by_xpath(next_button).click()
self.select_from_list('aspNetApp-1-osImage', self.windows_image)
next_button = self.elements.get('button', 'Create')
self.driver.find_element_by_xpath(next_button).click()
def create_iisfarm_service(self, service_name):
self.driver.find_element_by_id(
'services__action_CreateService').click()
self.select_from_list(
'service_choice-service', 'Internet Information Services Web Farm')
next_button = self.elements.get('button', 'Next')
self.driver.find_element_by_xpath(next_button).click()
self.fill_field(by.By.ID, 'id_webServerFarm-0-name', service_name)
self.fill_field(
by.By.ID, 'id_webServerFarm-0-adminPassword', 'P@ssw0rd')
self.fill_field(
by.By.ID, 'id_webServerFarm-0-adminPassword-clone', 'P@ssw0rd')
next_button = self.elements.get('button', 'Next2')
self.driver.find_element_by_xpath(next_button).click()
self.select_from_list('webServerFarm-1-osImage', self.windows_image)
next_button = self.elements.get('button', 'Create')
self.driver.find_element_by_xpath(next_button).click()
def create_aspfarm_service(self, service_name):
self.driver.find_element_by_id(
'services__action_CreateService').click()
self.select_from_list(
'service_choice-service', 'ASP.NET Application Web Farm')
next_button = self.elements.get('button', 'Next')
self.driver.find_element_by_xpath(next_button).click()
self.fill_field(by.By.ID, 'id_aspNetAppFarm-0-name', service_name)
self.fill_field(
by.By.ID, 'id_aspNetAppFarm-0-adminPassword', 'P@ssw0rd')
self.fill_field(
by.By.ID, 'id_aspNetAppFarm-0-adminPassword-clone', 'P@ssw0rd')
self.fill_field(
by.By.ID, 'id_aspNetAppFarm-0-repository', self.asp_git_repository)
next_button = self.elements.get('button', 'Next2')
self.driver.find_element_by_xpath(next_button).click()
self.select_from_list('aspNetAppFarm-1-osImage', self.windows_image)
next_button = self.elements.get('button', 'Create')
self.driver.find_element_by_xpath(next_button).click()
def create_mssql_service(self, service_name):
self.driver.find_element_by_id(
'services__action_CreateService').click()
self.select_from_list('service_choice-service', 'MS SQL Server')
next_button = self.elements.get('button', 'Next')
self.driver.find_element_by_xpath(next_button).click()
self.fill_field(by.By.ID, 'id_msSqlServer-0-name', service_name)
self.fill_field(
by.By.ID, 'id_msSqlServer-0-adminPassword', 'P@ssw0rd')
self.fill_field(
by.By.ID, 'id_msSqlServer-0-adminPassword-clone', 'P@ssw0rd')
self.fill_field(
by.By.ID, 'id_msSqlServer-0-saPassword', 'P@ssw0rd')
self.fill_field(
by.By.ID, 'id_msSqlServer-0-saPassword-clone', 'P@ssw0rd')
next_button = self.elements.get('button', 'Next2')
self.driver.find_element_by_xpath(next_button).click()
self.select_from_list('msSqlServer-1-osImage', self.windows_image)
next_button = self.elements.get('button', 'Create')
self.driver.find_element_by_xpath(next_button).click()
def create_sql_cluster_service(self, service_name, domain_name):
self.driver.find_element_by_id(
'services__action_CreateService').click()
self.select_from_list(
'service_choice-service', 'MS SQL Server Cluster')
next_button = self.elements.get('button', 'Next')
self.driver.find_element_by_xpath(next_button).click()
self.fill_field(
by.By.ID, 'id_msSqlClusterServer-0-name', service_name)
self.fill_field(
by.By.ID, 'id_msSqlClusterServer-0-adminPassword', 'P@ssw0rd')
self.fill_field(
by.By.ID,
'id_msSqlClusterServer-0-adminPassword-clone', 'P@ssw0rd')
self.select_from_list('msSqlClusterServer-0-domain', domain_name)
self.fill_field(
by.By.ID, 'id_msSqlClusterServer-0-saPassword', 'P@ssw0rd')
self.fill_field(
by.By.ID, 'id_msSqlClusterServer-0-saPassword-clone', 'P@ssw0rd')
next_button = self.elements.get('button', 'Next2')
self.driver.find_element_by_xpath(next_button).click()
self.fill_field(
by.By.ID, 'id_msSqlClusterServer-1-clusterIp', '1.1.1.1')
self.fill_field(
by.By.ID, 'id_msSqlClusterServer-1-clusterName', 'cluster')
self.fill_field(
by.By.ID, 'id_msSqlClusterServer-1-agGroupName', 'ag-name')
self.fill_field(
by.By.ID,
'id_msSqlClusterServer-1-agListenerName', 'listener_name')
self.fill_field(
by.By.ID, 'id_msSqlClusterServer-1-agListenerIP', 'listener_name')
self.fill_field(
by.By.ID, 'id_msSqlClusterServer-1-sqlServiceUserName', 'admin')
self.fill_field(
by.By.ID, 'id_msSqlClusterServer-1-sqlServicePassword', 'P@ssw0rd')
self.fill_field(
by.By.ID, 'id_msSqlClusterServer-1-sqlServicePassword-clone',
'P@ssw0rd')
next_button = self.elements.get('button', 'Next2')
self.driver.find_element_by_xpath(next_button).click()
cluster_ip = self.get_env_subnet()
self.fill_field(
by.By.ID, 'id_msSqlClusterServer-1-clusterIp', cluster_ip)
listener_ip = self.get_env_subnet()
self.fill_field(
by.By.ID, 'id_msSqlClusterServer-1-agListenerIP', listener_ip)
next_button = self.elements.get('button', 'Next2')
self.driver.find_element_by_xpath(next_button).click()
self.fill_field(
by.By.ID, 'id_msSqlClusterServer-2-databases', 'testbase')
next_button = self.elements.get('button', 'Next2')
self.driver.find_element_by_xpath(next_button).click()
self.select_from_list(
'msSqlClusterServer-3-osImage', self.windows_image)
next_button = self.elements.get('button', 'Create')
self.driver.find_element_by_xpath(next_button).click()
def get_element_id(self, element_name):
path = self.driver.find_element_by_link_text(
element_name).get_attribute("href")
return path.split('/')[-2]
def delete_service(self, service_name):
id = self.get_element_id(service_name)
self.driver.find_element_by_id('services__row_%s__action_delete'
% id).click()
self.driver.find_element_by_link_text('Delete Service').click()
def get_env_subnet(self):
help_text = self.driver.find_element_by_xpath(
"(.//span[@class = 'help-inline'])[1]").text
subnet = help_text.split('.')[-2]
num = random.randint(0, 255)
return '10.0.%s.%d' % (subnet, num)
def check_that_error_message_is_correct(self, error_message, num):
next_button = self.elements.get('button', 'Next2')
self.driver.find_element_by_xpath(next_button).click()
time.sleep(3)
appeared_text = self.driver.find_element_by_xpath(
"(.//div[@class = 'control-group form-field clearfix error'][%d])"
% num).text
index = appeared_text.find(error_message)
if index != -1:
return True
else:
return False
def check_that_alert_message_is_appeared(self, error_message):
next_button = self.elements.get('button', 'Next2')
self.driver.find_element_by_xpath(next_button).click()
xpath = ".//*[@id='create_service_form']/div[2]/input[2]"
WebDriverWait(self.driver, 10).until(lambda s: s.find_element(
by.By.XPATH, xpath).is_displayed())
appeared_text = self.driver.find_element_by_xpath(
"(.//div[@class = 'alert alert-message alert-error'])").text
index = appeared_text.find(error_message)
if index != -1:
return True
else:
return False
def click_on_service_catalog_action(self, action):
self.driver.find_element_by_xpath(
".//*[@id='service_catalog__action_%s']" % action).click()
def compose_trivial_service(self, name):
self.click_on_service_catalog_action(action='compose_service')
self.fill_field(by.By.ID, 'id_service_display_name', name)
self.fill_field(by.By.ID, 'id_full_service_name', '%sService' % name)
self.fill_field(by.By.ID, 'id_author', cfg.common.user)
self.fill_field(by.By.ID, 'id_description', 'New Service')
self.driver.find_element_by_link_text('UI Files').click()
self.driver.find_element_by_xpath(".//*[@value = 'ui##Demo.yaml']")
self.driver.find_element_by_link_text('Workflows').click()
self.driver.find_element_by_xpath(
".//*[@name = 'workflows@@workflows##Demo.xml@@selected']")
self.driver.find_element_by_link_text('Heat Templates').click()
self.driver.find_element_by_xpath(
".//*[@name = 'heat@@heat##Demo.template@@selected']")
submit_button = self.elements.get('button', 'InputSubmit')
self.driver.find_element_by_xpath(submit_button).click()
def select_action_for_service(self, service, action):
time.sleep(2)
if action == 'more':
self.driver.find_element_by_xpath(
".//*[@id='service_catalog__row__%s']/td[7]/div/a[2]"
% service).click()
WebDriverWait(self.driver, 10).until(lambda s: s.find_element(
by.By.XPATH, ".//*[@id='service_catalog__row_%s__action_"
"manage_service']" % service).is_displayed())
else:
self.driver.find_element_by_xpath(
".//*[@id='service_catalog__row_%s__action_%s']"
% (service, action)).click()
def check_service_parameter(self, service, column, value):
time.sleep(2)
result = self.driver.find_element_by_xpath(
".//*[@id='service_catalog__row__%s']/td[%s]"
% (service, column)).text
if result == value:
return True
else:
return False