Add testcase 'Update cluster template'

Testcase checks updating existing cluster template in Horizon dashboard.

Change-Id: Ied781ba06a7985add20724151022404a611608c9
This commit is contained in:
Georgy Dyuldin 2016-01-26 17:02:34 +03:00
parent e62e51640a
commit d6349ffd6b
5 changed files with 251 additions and 51 deletions

View File

@ -10,38 +10,117 @@
# License for the specific language governing permissions and limitations
# under the License.
from openstack_dashboard.test.integration_tests.regions import forms
from openstack_dashboard.test.integration_tests.regions import tables
from sahara_dashboard.test.integration_tests.pages import basepage
from sahara_dashboard.test.integration_tests.pages import mixins
from sahara_dashboard.test.integration_tests.regions import forms
class ClusterTemplateForm(forms.TabbedFormRegion):
CREATE_FIELD_MAPPING = (
('cluster_template_name', 'description', 'use_autoconfig',
'anti_affinity'),
(),
('CONF:general:Timeout for disk preparing',
'CONF:general:Enable NTP service',
'CONF:general:URL of NTP server',
'CONF:general:Heat Wait Condition timeout',
'CONF:general:Enable XFS')
)
def __init__(self, *args, **kwargs):
kwargs['field_mappings'] = self.CREATE_FIELD_MAPPING
super(ClusterTemplateForm, self).__init__(*args, **kwargs)
def set_nodegroup_templates(self, node_group_templates):
self.switch_to(1)
template_el = self.src_elem.find_element_by_name('template')
add_button = self.src_elem.find_element_by_id('add_group_button')
to_add_templates = list(node_group_templates)
groups_table = self.src_elem.find_element_by_id('groups_table')
if groups_table.is_displayed():
for row in groups_table.find_elements_by_css_selector(
'tr.data-template-row'
):
name = row.find_element_by_xpath('.//input[1]').get_attribute(
'value')
if name in to_add_templates:
to_add_templates.remove(name)
else:
row.find_element_by_css_selector(
'input[type=button]').click()
for template_name in to_add_templates:
for option in template_el.find_elements_by_tag_name('option'):
if option.text == template_name:
option.click()
add_button.click()
break
class UpdateMixin(object):
@tables.bind_row_action('edit')
def get_edit_form(self, button, row):
button.click()
return ClusterTemplateForm(self.driver, self.conf)
class ClustertemplatesPage(mixins.PluginSelectMixin, mixins.DeleteMixin,
basepage.BaseDataProcessingPage):
TABLE_NAME = "cluster_templates"
CREATE_FIELD_MAPPING = (
('cluster_template_name',),
(),
()
)
@classmethod
def get_table_mixins(cls):
return (super(ClustertemplatesPage, cls).get_table_mixins() +
(UpdateMixin,))
@property
def create_form(self):
return forms.TabbedFormRegion(
self.driver, self.conf, field_mappings=self.CREATE_FIELD_MAPPING)
return ClusterTemplateForm(self.driver, self.conf)
def create(self, plugin_name, plugin_version, name, node_group_templates):
def create(self, plugin_name, plugin_version, name, node_group_templates,
**kwargs):
self.choose_plugin(plugin_name, plugin_version)
form = self.create_form
form.cluster_template_name.text = name
form.switch_to(1)
template_el = form.src_elem.find_element_by_name('template')
add_button = form.src_elem.find_element_by_id('add_group_button')
for template_name in node_group_templates:
for option in template_el.find_elements_by_tag_name('option'):
if option.text == template_name:
option.click()
add_button.click()
break
kwargs.update({
'cluster_template_name': name
})
form.set_values(**kwargs)
form.set_nodegroup_templates(node_group_templates)
form.submit()
def update(self, name, node_group_templates=(), **kwargs):
row = self._get_row_with_name(name)
form = self.table.get_edit_form(row)
form.set_values(**kwargs)
form.set_nodegroup_templates(node_group_templates)
form.submit()
def get_details(self, name):
details = {'node_groups': {}}
row = self._get_row_with_name(name)
for node_group in row.cells['node_groups'].text.split('\n'):
key, delimiter, value = node_group.partition(':')
if delimiter == ':':
details['node_groups'][key] = value.strip()
self.table.src_elem.find_element_by_link_text(name).click()
items = self.driver.find_elements_by_css_selector('div.detail dt')
for item in items:
key = item.text
value_elem = item.find_element_by_xpath('./following-sibling::*')
if value_elem.tag_name != "dd":
continue
value = value_elem.text
details[key] = value
self.driver.find_element_by_link_text('Configuration Details').click()
items = self.driver.find_elements_by_css_selector('div.detail > dl li')
for item in items:
key, delimiter, value = item.text.partition(':')
if delimiter == ':':
details[key] = value.strip()
for key, value in details.items():
if '\n' in value:
details[key] = set(value.split('\n'))
return details

View File

@ -10,11 +10,11 @@
# License for the specific language governing permissions and limitations
# under the License.
from openstack_dashboard.test.integration_tests.regions import forms
from openstack_dashboard.test.integration_tests.regions import tables
from sahara_dashboard.test.integration_tests.pages import basepage
from sahara_dashboard.test.integration_tests.pages import mixins
from sahara_dashboard.test.integration_tests.regions import forms
CREATE_FIELD_MAPPING = (
@ -51,35 +51,6 @@ class NodegrouptemplatesPage(mixins.PluginSelectMixin, mixins.DeleteMixin,
return forms.TabbedFormRegion(
self.driver, self.conf, field_mappings=CREATE_FIELD_MAPPING)
def _set_checkbox_group(self, form, group_name, values=()):
for el in form.src_elem.find_elements_by_xpath(
'.//input[@name="{}"]'.format(group_name)
):
elem_id = el.get_attribute('id')
label = form.src_elem.find_element_by_css_selector(
'label[for={}]'.format(elem_id))
if (label.text in values) != el.is_selected():
label.click()
def _fill_form(self, form, **kwargs):
for tab_num, fields in enumerate(CREATE_FIELD_MAPPING):
form.switch_to(tab_num)
for key in fields:
value = kwargs.get(key)
if value is None:
continue
if isinstance(value, (list, tuple)):
self._set_checkbox_group(form, key, value)
continue
field = getattr(form, key)
if hasattr(field, 'mark'):
if value:
field.mark()
else:
field.unmark()
else:
field.text = value
def create(self, plugin_name, plugin_version, nodegroup_name, flavor,
floating_ip_pool=None, availability_zone='nova',
proxygateway=False, processes=(), **kwargs):
@ -93,13 +64,13 @@ class NodegrouptemplatesPage(mixins.PluginSelectMixin, mixins.DeleteMixin,
'proxygateway': proxygateway,
'processes': processes,
})
self._fill_form(form, **kwargs)
form.set_values(**kwargs)
form.submit()
def update(self, group_name, **kwargs):
row = self._get_row_with_name(group_name)
form = self.table.get_edit_form(row)
self._fill_form(form, **kwargs)
form.set_values(**kwargs)
form.submit()
def get_details(self, name):

View File

@ -0,0 +1,50 @@
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from openstack_dashboard.test.integration_tests.regions import forms
class TabbedFormRegion(forms.TabbedFormRegion):
def __init__(self, driver, conf, field_mappings=None, default_tab=0):
self.original_field_mappings = field_mappings
super(TabbedFormRegion, self).__init__(driver, conf,
field_mappings=field_mappings)
def _set_checkbox_group(self, group_name, values=()):
for el in self.src_elem.find_elements_by_xpath(
'.//input[@name="{}"]'.format(group_name)
):
elem_id = el.get_attribute('id')
label = self.src_elem.find_element_by_css_selector(
'label[for={}]'.format(elem_id))
if (label.text in values) != el.is_selected():
label.click()
def set_values(self, **kwargs):
for tab_num, fields in enumerate(self.original_field_mappings):
self.switch_to(tab_num)
for key in fields:
value = kwargs.get(key)
if value is None:
continue
if isinstance(value, (list, tuple)):
self._set_checkbox_group(key, value)
continue
field = getattr(self, key)
if hasattr(field, 'mark'):
if value:
field.mark()
else:
field.unmark()
else:
field.text = value

View File

@ -275,3 +275,103 @@ class TestUpdateNodeGroupTemplate(SaharaTestCase):
)
nodegrouptpls_pg.delete_many((self.old_name, self.new_name))
super(TestUpdateNodeGroupTemplate, self).tearDown()
class TestUpdateClusterTemplate(SaharaTestCase):
def setUp(self):
super(TestUpdateClusterTemplate, self).setUp()
self.flavor_name = self.gen_name('flavor')
self.image_name = self.gen_name("image")
self.worker_name = self.gen_name("worker")
self.master_name = self.gen_name("master")
self.cluster_template_name = self.gen_name("old-name")
self.new_cluster_template_name = self.gen_name("new-name")
nodegrouptpls_pg = (
self.home_pg.go_to_dataprocessing_clusters_nodegrouptemplatespage()
)
nodegrouptpls_pg.create(
PLUGIN_NAME, PLUGIN_VERSION, nodegroup_name=self.worker_name,
flavor='m1.tiny', processes=['tasktracker', 'datanode'])
self.assertTrue(nodegrouptpls_pg.has_success_message())
self.assertFalse(nodegrouptpls_pg.has_error_message())
self.assertTrue(nodegrouptpls_pg.is_present(self.worker_name),
"Worker template was not created.")
nodegrouptpls_pg.create(
PLUGIN_NAME, PLUGIN_VERSION, nodegroup_name=self.master_name,
flavor='m1.tiny', proxygateway=True,
floating_ip_pool=self.CONFIG.sahara.ip_pool,
processes=['jobtracker', 'namenode'])
self.assertTrue(nodegrouptpls_pg.has_success_message())
self.assertFalse(nodegrouptpls_pg.has_error_message())
self.assertTrue(nodegrouptpls_pg.is_present(self.master_name),
"Worker template was not created.")
clustertpls_pg = (
self.home_pg.go_to_dataprocessing_clusters_clustertemplatespage())
clustertpls_pg.create(
PLUGIN_NAME, PLUGIN_VERSION, name=self.cluster_template_name,
node_group_templates=[self.worker_name])
self.assertTrue(clustertpls_pg.has_success_message())
self.assertFalse(clustertpls_pg.has_error_message())
self.assertTrue(clustertpls_pg.is_present(self.cluster_template_name),
"Cluster template was not created.")
def test_update(self):
clustertpls_pg = (
self.home_pg.go_to_dataprocessing_clusters_clustertemplatespage())
kwargs = {
'cluster_template_name': self.new_cluster_template_name,
'description': '{} description'.format(
self.new_cluster_template_name),
'use_autoconfig': False,
'anti_affinity': ['namenode', 'datanode', 'tasktracker',
'jobtracker'],
'node_group_templates': [self.master_name],
'CONF:general:Timeout for disk preparing': 152,
'CONF:general:Enable NTP service': False,
'CONF:general:URL of NTP server': 'http://ntp.org/',
'CONF:general:Heat Wait Condition timeout': 123,
'CONF:general:Enable XFS': False,
}
clustertpls_pg.update(name=self.cluster_template_name, **kwargs)
self.assertTrue(clustertpls_pg.has_success_message())
self.assertFalse(clustertpls_pg.has_error_message())
self.assertTrue(
clustertpls_pg.is_present(self.new_cluster_template_name),
"Cluster template was not updated.")
details = clustertpls_pg.get_details(self.new_cluster_template_name)
expected = {
'Name': self.new_cluster_template_name,
'Description': kwargs['description'],
'Plugin': 'fake',
'Version': '0.1',
'Use auto-configuration': 'False',
'Anti-affinity enabled for': set(['namenode', 'datanode',
'tasktracker', 'jobtracker']),
'Enable NTP service': 'False',
'Enable XFS': 'False',
'Heat Wait Condition timeout': '123',
'Timeout for disk preparing': '152',
'URL of NTP server': 'http://ntp.org/',
'node_groups': {
self.master_name: '1'
}
}
details = {k: v for k, v in details.items() if k in expected}
self.assertEqual(expected, details)
def tearDown(self):
clustertpls_pg = (
self.home_pg.go_to_dataprocessing_clusters_clustertemplatespage())
clustertpls_pg.delete_many((self.cluster_template_name,
self.new_cluster_template_name))
nodegrouptpls_pg = (
self.home_pg.go_to_dataprocessing_clusters_nodegrouptemplatespage()
)
nodegrouptpls_pg.delete_many((self.worker_name, self.master_name))
super(TestUpdateClusterTemplate, self).tearDown()