Add testcase 'Update cluster template'
Testcase checks updating existing cluster template in Horizon dashboard. Change-Id: Ied781ba06a7985add20724151022404a611608c9
This commit is contained in:
parent
e62e51640a
commit
d6349ffd6b
|
@ -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
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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
|
|
@ -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()
|
||||
|
|
Loading…
Reference in New Issue