From 953ab7807b65a502fd220f89e5e9610f625ff816 Mon Sep 17 00:00:00 2001 From: polo Date: Tue, 15 Sep 2015 15:21:36 +0200 Subject: [PATCH 01/20] add compute resources --- tests/foreman/rhci/test_computeresources.py | 59 +++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 tests/foreman/rhci/test_computeresources.py diff --git a/tests/foreman/rhci/test_computeresources.py b/tests/foreman/rhci/test_computeresources.py new file mode 100644 index 00000000000..f17046be5c4 --- /dev/null +++ b/tests/foreman/rhci/test_computeresources.py @@ -0,0 +1,59 @@ +from robottelo.test import UITestCase +from robottelo.config import conf +from robottelo.ui.session import Session +from robottelo.constants import FOREMAN_PROVIDERS +from robottelo.ui.factory import make_resource +from ddt import data, ddt + +class ComputeResourceTestCase(UITestCase): + + #TODO create this in config file + #current_rhev_url = conf.properties['main.rhev.hostname'] + #rhev_name = conf.properties['main.rhev.name'] + #rhev_username = conf.properties['main.rhev.username'] + #rhev_password = conf.properties['main.rhev.password'] + #rhev_datacenter = conf.properties['main.rhev.datacenter'] + default_org = 'Default Organization' + default_loc = 'Default Location' + + @data( + {'name': conf.properties['main.rhev.name'], + 'type': 'rhev', + 'url': conf.properties['main.rhev.hostname'], + 'username': conf.properties['main.rhev.username'], + 'password': conf.properties['main.rhev.password'], + 'datacenter':conf.properties['main.rhev.datacenter']}, + {'name': conf.properties['main.vmware.name'], + 'type': 'vmware', + 'url': conf.properties['main.vmware.hostname'], + 'username': conf.properties['main.vmware.username'], + 'password': conf.properties['main.vmware.password'], + 'datacenter': conf.properties['main.vmware.datacenter']} + ) + def test_create_compute_resource(self): + """Create rhev and vmware compute resource""" + with Session(self.browser) as session: + make_resource( + session, + name=data['name'], + provider_type=FOREMAN_PROVIDERS[data['type']], + parameter_list=[ + ['URL', data['url'], 'field'], + ['Username', data['username'], 'field'], + ['Password', data['password'], 'field'], + #TODO this is different with rhev and with vmware + ['Datacenter', self.rhev_datacenter, 'special select'] + ], + orgs=[self.default_org], + org_select=True, + locations=[self.default_loc], + loc_select=True + ) + search = self.compute_resource.search(self.rhev_name) + self.assertIsNotNone(search) + + def test_edit_compute_resource(self): + pass + + def test_delete_compute_resource(self): + pass \ No newline at end of file From 0bf8eb90a25a15010d49d5497068bb66a326a4b4 Mon Sep 17 00:00:00 2001 From: polo Date: Tue, 15 Sep 2015 16:00:12 +0200 Subject: [PATCH 02/20] high priority test cases --- tests/foreman/rhci/test_computeresources.py | 38 +++++++++++++++++---- 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/tests/foreman/rhci/test_computeresources.py b/tests/foreman/rhci/test_computeresources.py index f17046be5c4..a0c347daac4 100644 --- a/tests/foreman/rhci/test_computeresources.py +++ b/tests/foreman/rhci/test_computeresources.py @@ -8,11 +8,6 @@ class ComputeResourceTestCase(UITestCase): #TODO create this in config file - #current_rhev_url = conf.properties['main.rhev.hostname'] - #rhev_name = conf.properties['main.rhev.name'] - #rhev_username = conf.properties['main.rhev.username'] - #rhev_password = conf.properties['main.rhev.password'] - #rhev_datacenter = conf.properties['main.rhev.datacenter'] default_org = 'Default Organization' default_loc = 'Default Location' @@ -56,4 +51,35 @@ def test_edit_compute_resource(self): pass def test_delete_compute_resource(self): - pass \ No newline at end of file + pass + + def test_retrieve_vm_list(self): + pass + + def test_retrieve_template_list(self): + pass + + def test_vm_start_stop(self): + pass + + def test_delete_vm(self): + pass + + def test_add_image(self): + pass + + def test_delete_image(self): + pass + + def test_provision_image(self): + pass + + #default and custom compute profile + def test_provision_image_with_compute_profile(self): + pass + + #to specific folder, static IP & custom spec, + # configure DNS & domain settings + def test_provision_vm(self): + pass + From 2ea6826b4b023dbe96b3bf6ab1d83fae2e61810a Mon Sep 17 00:00:00 2001 From: polo Date: Wed, 16 Sep 2015 10:20:19 +0200 Subject: [PATCH 03/20] wip --- tests/foreman/rhci/test_computeresources.py | 33 +++++++++++++++++---- 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/tests/foreman/rhci/test_computeresources.py b/tests/foreman/rhci/test_computeresources.py index a0c347daac4..36187b7a980 100644 --- a/tests/foreman/rhci/test_computeresources.py +++ b/tests/foreman/rhci/test_computeresources.py @@ -25,7 +25,7 @@ class ComputeResourceTestCase(UITestCase): 'password': conf.properties['main.vmware.password'], 'datacenter': conf.properties['main.vmware.datacenter']} ) - def test_create_compute_resource(self): + def test_create_compute_resource(self, data): """Create rhev and vmware compute resource""" with Session(self.browser) as session: make_resource( @@ -44,14 +44,35 @@ def test_create_compute_resource(self): locations=[self.default_loc], loc_select=True ) - search = self.compute_resource.search(self.rhev_name) + search = self.compute_resource.search(data['name']) self.assertIsNotNone(search) - def test_edit_compute_resource(self): - pass + @data( + {'name': conf.properties['main.rhev.name'], + 'new_name': '%s-updated' % conf.properties['main.rhev.name']}, + {'name': conf.properties['main.vmware.name'], + 'new_name': '%s-updated' % conf.properties['main.vmware.name']} + ) + def test_edit_compute_resource(self, data): + with Session(self.browser) as session: + search = self.compute_resource.search(data['name']) + self.assertIsNotNone(search) + self.compute_resource.update(name=data['name'], newname=data['new_name']) + search = self.compute_resource.search(data['new_name']) + self.assertIsNotNone(search) + + @data( #TODO + {'name': 'placeholder'}, + {'name': 'placeholder'} + ) + def test_delete_compute_resource(self, data): + with Session(self.browser) as session: + search = self.compute_resource.search(data['name']) + self.assertIsNotNone(search) + self.compute_resource.delete(data['name']) + search = self.compute_resource.search(data['name']) + self.assertIsNone(search) - def test_delete_compute_resource(self): - pass def test_retrieve_vm_list(self): pass From 7688a6f9a4a9eacc6222e1d9d44eea6c5c8b7722 Mon Sep 17 00:00:00 2001 From: polo Date: Thu, 17 Sep 2015 13:39:54 +0200 Subject: [PATCH 04/20] fix special select --- robottelo/ui/computeresource.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/robottelo/ui/computeresource.py b/robottelo/ui/computeresource.py index 05d96129222..19b1d1d212a 100644 --- a/robottelo/ui/computeresource.py +++ b/robottelo/ui/computeresource.py @@ -68,8 +68,8 @@ def _configure_resource_provider( 'button' )) self.click(locators[button_locator]) - self.find_element( - locators[param_locator] + Select( + self.find_element(locators[param_locator]) ).select_by_visible_text(parameter_value) def _configure_orgs(self, orgs, org_select): From 8897f01680128c1da5aa54443144868937d0ea44 Mon Sep 17 00:00:00 2001 From: polo Date: Thu, 17 Sep 2015 13:40:28 +0200 Subject: [PATCH 05/20] revamp; rhev tests are working --- tests/foreman/rhci/test_computeresources.py | 97 +++++++++++---------- 1 file changed, 53 insertions(+), 44 deletions(-) diff --git a/tests/foreman/rhci/test_computeresources.py b/tests/foreman/rhci/test_computeresources.py index 36187b7a980..c6869123da5 100644 --- a/tests/foreman/rhci/test_computeresources.py +++ b/tests/foreman/rhci/test_computeresources.py @@ -1,79 +1,88 @@ from robottelo.test import UITestCase -from robottelo.config import conf +from robottelo.common import conf from robottelo.ui.session import Session -from robottelo.constants import FOREMAN_PROVIDERS +from robottelo.common.constants import FOREMAN_PROVIDERS from robottelo.ui.factory import make_resource from ddt import data, ddt +@ddt class ComputeResourceTestCase(UITestCase): #TODO create this in config file default_org = 'Default Organization' default_loc = 'Default Location' - @data( - {'name': conf.properties['main.rhev.name'], - 'type': 'rhev', - 'url': conf.properties['main.rhev.hostname'], - 'username': conf.properties['main.rhev.username'], - 'password': conf.properties['main.rhev.password'], - 'datacenter':conf.properties['main.rhev.datacenter']}, - {'name': conf.properties['main.vmware.name'], - 'type': 'vmware', - 'url': conf.properties['main.vmware.hostname'], - 'username': conf.properties['main.vmware.username'], - 'password': conf.properties['main.vmware.password'], - 'datacenter': conf.properties['main.vmware.datacenter']} - ) - def test_create_compute_resource(self, data): - """Create rhev and vmware compute resource""" + rhev_name='apagac-rhev-res' + rhev_hostname_api='https://engine.cfme.lab.eng.rdu2.redhat.com/api' + rhev_username='admin@internal' + rhev_password='changeme' + rhev_datacenter='Default' + + def test_create_delete_rhev_compute_resource(self): with Session(self.browser) as session: make_resource( session, - name=data['name'], - provider_type=FOREMAN_PROVIDERS[data['type']], + name=self.rhev_name, + provider_type=FOREMAN_PROVIDERS['rhev'], parameter_list=[ - ['URL', data['url'], 'field'], - ['Username', data['username'], 'field'], - ['Password', data['password'], 'field'], - #TODO this is different with rhev and with vmware + ['URL', self.rhev_hostname_api, 'field'], + ['Username', self.rhev_username, 'field'], + ['Password', self.rhev_password, 'field'], ['Datacenter', self.rhev_datacenter, 'special select'] ], orgs=[self.default_org], - org_select=True, + org_select=False, locations=[self.default_loc], loc_select=True ) - search = self.compute_resource.search(data['name']) + search = self.compute_resource.search(self.rhev_name) self.assertIsNotNone(search) + self.compute_resource.delete(self.rhev_name) + search = self.compute_resource.search(self.rhev_name) + self.assertIsNone(search) + + #def test_create_vmware_compute_resource(self): + # pass + + #def test_create_osp_compute_resource(self): + # pass + + #def test_create_docker_compute_resource(self): + # pass @data( - {'name': conf.properties['main.rhev.name'], - 'new_name': '%s-updated' % conf.properties['main.rhev.name']}, - {'name': conf.properties['main.vmware.name'], - 'new_name': '%s-updated' % conf.properties['main.vmware.name']} + {'name': rhev_name, + 'new_name': '%s-updated' % rhev_name}, + #{'name': 'vmware name'}, + #{'name': 'osp name'}, + #{'name': 'docker name'} ) def test_edit_compute_resource(self, data): with Session(self.browser) as session: - search = self.compute_resource.search(data['name']) + make_resource( + session, + name=self.rhev_name, + provider_type=FOREMAN_PROVIDERS['rhev'], + parameter_list=[ + ['URL', self.rhev_hostname_api, 'field'], + ['Username', self.rhev_username, 'field'], + ['Password', self.rhev_password, 'field'], + ['Datacenter', self.rhev_datacenter, 'special select'] + ], + orgs=[self.default_org], + org_select=False, + locations=[self.default_loc], + loc_select=True + ) + search = self.compute_resource.search(self.rhev_name) self.assertIsNotNone(search) self.compute_resource.update(name=data['name'], newname=data['new_name']) search = self.compute_resource.search(data['new_name']) self.assertIsNotNone(search) - - @data( #TODO - {'name': 'placeholder'}, - {'name': 'placeholder'} - ) - def test_delete_compute_resource(self, data): - with Session(self.browser) as session: - search = self.compute_resource.search(data['name']) - self.assertIsNotNone(search) - self.compute_resource.delete(data['name']) - search = self.compute_resource.search(data['name']) + self.compute_resource.delete(data['new_name']) self.assertIsNone(search) - + """ def test_retrieve_vm_list(self): pass @@ -103,4 +112,4 @@ def test_provision_image_with_compute_profile(self): # configure DNS & domain settings def test_provision_vm(self): pass - + """ From d1f3aa019f4eea6a13c869b3980fe0374422da21 Mon Sep 17 00:00:00 2001 From: polo Date: Thu, 17 Sep 2015 13:47:59 +0200 Subject: [PATCH 06/20] fix --- tests/foreman/rhci/test_computeresources.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/foreman/rhci/test_computeresources.py b/tests/foreman/rhci/test_computeresources.py index c6869123da5..fd9da36b910 100644 --- a/tests/foreman/rhci/test_computeresources.py +++ b/tests/foreman/rhci/test_computeresources.py @@ -12,11 +12,11 @@ class ComputeResourceTestCase(UITestCase): default_org = 'Default Organization' default_loc = 'Default Location' - rhev_name='apagac-rhev-res' - rhev_hostname_api='https://engine.cfme.lab.eng.rdu2.redhat.com/api' - rhev_username='admin@internal' - rhev_password='changeme' - rhev_datacenter='Default' + rhev_name='' + rhev_hostname_api='' + rhev_username='' + rhev_password='' + rhev_datacenter='' def test_create_delete_rhev_compute_resource(self): with Session(self.browser) as session: From ee26263760cb8ac2c03639c69f9647b2f697b574 Mon Sep 17 00:00:00 2001 From: polo Date: Thu, 17 Sep 2015 13:56:18 +0200 Subject: [PATCH 07/20] config file update --- robottelo.properties.sample | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/robottelo.properties.sample b/robottelo.properties.sample index c4a93559541..9a39560b94e 100644 --- a/robottelo.properties.sample +++ b/robottelo.properties.sample @@ -69,6 +69,13 @@ rhel7_repo=http://example.com/yum/repo_files/rhel7-updates.repo # in other words, the daemon is initialized with `--host tcp://0.0.0.0:`. external_url=http://localhost:2375 +[rhev] +name= +hostname= +username= +password= +datacenter= + [foreman] admin.username=admin admin.password=changeme From 8a198e754e26d3934486745cd7b08da62ff15515 Mon Sep 17 00:00:00 2001 From: polo Date: Mon, 21 Sep 2015 08:51:39 +0200 Subject: [PATCH 08/20] before locators --- robottelo/ui/computeresource.py | 9 +++++++++ tests/foreman/rhci/test_computeresources.py | 16 ++++++++-------- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/robottelo/ui/computeresource.py b/robottelo/ui/computeresource.py index 19b1d1d212a..98a3f0a6f59 100644 --- a/robottelo/ui/computeresource.py +++ b/robottelo/ui/computeresource.py @@ -149,3 +149,12 @@ def delete(self, name, really=True): locators['resource.delete'], drop_locator=locators['resource.dropdown'] ) + + def list_vms(self): + pass + + def list_images(self): + pass + + def list_compute_profiles(self): + pass \ No newline at end of file diff --git a/tests/foreman/rhci/test_computeresources.py b/tests/foreman/rhci/test_computeresources.py index fd9da36b910..2f172db0a22 100644 --- a/tests/foreman/rhci/test_computeresources.py +++ b/tests/foreman/rhci/test_computeresources.py @@ -12,11 +12,11 @@ class ComputeResourceTestCase(UITestCase): default_org = 'Default Organization' default_loc = 'Default Location' - rhev_name='' - rhev_hostname_api='' - rhev_username='' - rhev_password='' - rhev_datacenter='' + rhev_name = conf.properties['rhev.name'] + rhev_hostname_api = conf.properties['rhev.hostname'] + rhev_username = conf.properties['rhev.username'] + rhev_password = conf.properties['rhev.password'] + rhev_datacenter = conf.properties['rhev.datacenter'] def test_create_delete_rhev_compute_resource(self): with Session(self.browser) as session: @@ -37,9 +37,9 @@ def test_create_delete_rhev_compute_resource(self): ) search = self.compute_resource.search(self.rhev_name) self.assertIsNotNone(search) - self.compute_resource.delete(self.rhev_name) - search = self.compute_resource.search(self.rhev_name) - self.assertIsNone(search) + #self.compute_resource.delete(self.rhev_name) + #search = self.compute_resource.search(self.rhev_name) + #self.assertIsNone(search) #def test_create_vmware_compute_resource(self): # pass From ea9fa599a2ae41201d3aa4401145650435a65e1b Mon Sep 17 00:00:00 2001 From: polo Date: Wed, 23 Sep 2015 16:13:28 +0200 Subject: [PATCH 09/20] another test working --- robottelo/ui/computeresource.py | 17 +++++++++++++-- robottelo/ui/locators.py | 22 +++++++++++++++++++ tests/foreman/rhci/test_computeresources.py | 24 +++++++++++++++++++-- 3 files changed, 59 insertions(+), 4 deletions(-) diff --git a/robottelo/ui/computeresource.py b/robottelo/ui/computeresource.py index 98a3f0a6f59..0b06a4fdf0b 100644 --- a/robottelo/ui/computeresource.py +++ b/robottelo/ui/computeresource.py @@ -142,6 +142,8 @@ def update(self, name, newname=None, parameter_list=None, def delete(self, name, really=True): """Removes the compute resource entity""" + #TODO added to make delete work when called with different context + Navigator(self.browser).go_to_compute_resources() self.delete_entity( name, really, @@ -150,8 +152,19 @@ def delete(self, name, really=True): drop_locator=locators['resource.dropdown'] ) - def list_vms(self): - pass + def list_vms(self, res_name): + resource = self.search(res_name) + #TODO if not found + strategy, value = locators['resource.get_by_name'] + locator = (strategy, value % res_name) + self.click(locator) + self.wait_until_element(locators['resource.virtual_machines_tab']) + self.click(locators['resource.virtual_machines_tab']) + #TODO if not foud + #vms = self.find_element(locators['resource.virtual_machines']) + vms = self.browser.find_elements_by_xpath( + "//table[contains(@id, 'DataTables')]//a[contains(@data-id, '%s')]" % res_name) + return vms def list_images(self): pass diff --git a/robottelo/ui/locators.py b/robottelo/ui/locators.py index 110d1627de8..d9a3bce2022 100644 --- a/robottelo/ui/locators.py +++ b/robottelo/ui/locators.py @@ -859,6 +859,28 @@ def __iter__(self): "resource.edit": ( By.XPATH, "//a[contains(@data-id,'edit') and contains(@href,'%s')]"), + # TODO testing locators + + "resource.virtual_machines_tab": ( + By.XPATH, + "//a[contains(@href, 'vms')]" + ), + "resource.virtual_machines": ( + By.XPATH, + #"//table[@id='DataTables_Table_0']//a" + #"//table[contains(@id, 'DataTables')]//*[contains(@data-id, 'vms')]" + #"//table[contains(@id, 'DataTables')]/../a" + #"//table[contains(@id, 'DataTables')]/tbody//tr/td/a" + #"//a[contains(@data-id, %s)]" + #"//a[contains(@href, %s)]" + "//a[contains(@href, 'vms')]" + ), + "resource.get_by_name": ( + By.XPATH, + #"//a[not(contains(@data-id, 'edit')) and contains(@href, '%s')]" + "//a[not(contains(@href, 'search')) and contains(@href, '%s')]" + ), + # Hosts # host.primary diff --git a/tests/foreman/rhci/test_computeresources.py b/tests/foreman/rhci/test_computeresources.py index 2f172db0a22..580c2eb8708 100644 --- a/tests/foreman/rhci/test_computeresources.py +++ b/tests/foreman/rhci/test_computeresources.py @@ -82,10 +82,30 @@ def test_edit_compute_resource(self, data): self.compute_resource.delete(data['new_name']) self.assertIsNone(search) - """ + def test_retrieve_vm_list(self): - pass + with Session(self.browser) as session: + make_resource( + session, + name=self.rhev_name, + provider_type=FOREMAN_PROVIDERS['rhev'], + parameter_list=[ + ['URL', self.rhev_hostname_api, 'field'], + ['Username', self.rhev_username, 'field'], + ['Password', self.rhev_password, 'field'], + ['Datacenter', self.rhev_datacenter, 'special select'] + ], + orgs=[self.default_org], + org_select=False, + locations=[self.default_loc], + loc_select=True + ) + for item in self.compute_resource.list_vms(self.rhev_name): + if item.text: + print "VM: %s" % item.text + self.compute_resource.delete(self.rhev_name) + """ def test_retrieve_template_list(self): pass From 3f7d16beb7cb378acd56ed6fa621557b3cb0c097 Mon Sep 17 00:00:00 2001 From: polo Date: Wed, 23 Sep 2015 17:24:50 +0200 Subject: [PATCH 10/20] another test working --- robottelo/ui/computeresource.py | 23 +++++++++++++++++++-- robottelo/ui/locators.py | 7 +++++++ tests/foreman/rhci/test_computeresources.py | 21 +++++++++++++++++-- 3 files changed, 47 insertions(+), 4 deletions(-) diff --git a/robottelo/ui/computeresource.py b/robottelo/ui/computeresource.py index 0b06a4fdf0b..83b84017042 100644 --- a/robottelo/ui/computeresource.py +++ b/robottelo/ui/computeresource.py @@ -163,11 +163,30 @@ def list_vms(self, res_name): #TODO if not foud #vms = self.find_element(locators['resource.virtual_machines']) vms = self.browser.find_elements_by_xpath( + #TODO needs correcting, see list_images "//table[contains(@id, 'DataTables')]//a[contains(@data-id, '%s')]" % res_name) return vms - def list_images(self): - pass + #TODO it fime permits, this: + #def add_image(self): + # pass + + def list_images(self, res_name): + resource = self.search(res_name) + #TODO if not found + strategy, value = locators['resource.get_by_name'] + locator = (strategy, value % res_name) + self.click(locator) + self.wait_until_element(locators['resource.images_tab']) + self.click(locators['resource.images_tab']) + #TODO if not found + images = self.browser.find_elements_by_xpath( + #"//table[contains(@id, 'DataTables')]/tbody//tr/td[1]") + #"//table[contains(@id, 'DataTables')]/tbody/tr/*[1]") + "//table[contains(@id, 'DataTables_Table_0')]/tbody/tr/*[1]") + return images + + def list_compute_profiles(self): pass \ No newline at end of file diff --git a/robottelo/ui/locators.py b/robottelo/ui/locators.py index d9a3bce2022..e4be7b9bbf9 100644 --- a/robottelo/ui/locators.py +++ b/robottelo/ui/locators.py @@ -865,6 +865,13 @@ def __iter__(self): By.XPATH, "//a[contains(@href, 'vms')]" ), + "resource.images_tab": ( + By.XPATH, + #"//a[contains(@href, 'images')]" + #"//a[contains(@text, 'Images')]" + "//a[.='Images']" + ), + #TODO this is not used "resource.virtual_machines": ( By.XPATH, #"//table[@id='DataTables_Table_0']//a" diff --git a/tests/foreman/rhci/test_computeresources.py b/tests/foreman/rhci/test_computeresources.py index 580c2eb8708..c744a002d78 100644 --- a/tests/foreman/rhci/test_computeresources.py +++ b/tests/foreman/rhci/test_computeresources.py @@ -105,10 +105,27 @@ def test_retrieve_vm_list(self): print "VM: %s" % item.text self.compute_resource.delete(self.rhev_name) - """ def test_retrieve_template_list(self): - pass + with Session(self.browser) as session: + make_resource( + name=self.rhev_name, + provider_type=FOREMAN_PROVIDERS['rhev'], + parameter_list=[ + ['URL', self.rhev_hostname_api, 'field'], + ['Username', self.rhev_username, 'field'], + ['Password', self.rhev_password, 'field'], + ['Datacenter', self.rhev_datacenter, 'special select'] + ], + orgs=[self.default_org], + org_select=False, + locations=[self.default_loc], + loc_select=True + ) + for item in self.compute_resource.list_images(self.rhev_name): + print "Image: %s" % item.text + self.compute_resource.delete(self.rhev_name) + """ def test_vm_start_stop(self): pass From 3a8a8ed40ba454d95616b2a49f2a0050649763e2 Mon Sep 17 00:00:00 2001 From: polo Date: Wed, 23 Sep 2015 18:16:06 +0200 Subject: [PATCH 11/20] wip, start-stop vm --- robottelo/ui/computeresource.py | 34 ++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/robottelo/ui/computeresource.py b/robottelo/ui/computeresource.py index 83b84017042..8d65c45cc10 100644 --- a/robottelo/ui/computeresource.py +++ b/robottelo/ui/computeresource.py @@ -152,13 +152,26 @@ def delete(self, name, really=True): drop_locator=locators['resource.dropdown'] ) + #TODO internal method + def go_to_compute_resource(self, res_name): + resource = self.search(res_name) + #TODO if not found + strategy, value = locators['resource.get_by_name'] + locator = (strategy, value % res_name) + self.click(locator) + #TODO consider better object to wait for + self.wait_until_element(locators['resource.virtual_machines_tab']) + def list_vms(self, res_name): + """ resource = self.search(res_name) #TODO if not found strategy, value = locators['resource.get_by_name'] locator = (strategy, value % res_name) self.click(locator) self.wait_until_element(locators['resource.virtual_machines_tab']) + """ + self.go_to_compute_resource(res_name) self.click(locators['resource.virtual_machines_tab']) #TODO if not foud #vms = self.find_element(locators['resource.virtual_machines']) @@ -167,17 +180,19 @@ def list_vms(self, res_name): "//table[contains(@id, 'DataTables')]//a[contains(@data-id, '%s')]" % res_name) return vms - #TODO it fime permits, this: - #def add_image(self): - # pass + def add_image(self): + pass def list_images(self, res_name): + """ resource = self.search(res_name) #TODO if not found strategy, value = locators['resource.get_by_name'] locator = (strategy, value % res_name) self.click(locator) self.wait_until_element(locators['resource.images_tab']) + """ + self.go_to_compute_resource(res_name) self.click(locators['resource.images_tab']) #TODO if not found images = self.browser.find_elements_by_xpath( @@ -186,7 +201,20 @@ def list_images(self, res_name): "//table[contains(@id, 'DataTables_Table_0')]/tbody/tr/*[1]") return images + def vm_action_start(self, res_name, vm_name): + self.go_to_compute_resource(res_name) + self.click(locators['resource.virtual_machines_tab']) + pass + def vm_action_stop(self, res_name, vm_name): + self.go_to_compute_resource(res_name) + self.click(locators['resource.virtual_machines_tab']) + pass + + def vm_action_toggle(self, res_name, vm_name): + self.go_to_compute_resource(res_name) + self.click(locators['resource.virtual_machines_tab']) + pass def list_compute_profiles(self): pass \ No newline at end of file From f5fa2e9f93b5fc17c933bdfea625fe3ac91e1d1b Mon Sep 17 00:00:00 2001 From: polo Date: Fri, 2 Oct 2015 18:00:07 +0200 Subject: [PATCH 12/20] vm power toggle works --- robottelo/ui/computeresource.py | 29 ++++++++++++++++----- robottelo/ui/locators.py | 15 +++++++++++ tests/foreman/rhci/test_computeresources.py | 10 +++++-- 3 files changed, 46 insertions(+), 8 deletions(-) diff --git a/robottelo/ui/computeresource.py b/robottelo/ui/computeresource.py index 8d65c45cc10..3c1a52f9d62 100644 --- a/robottelo/ui/computeresource.py +++ b/robottelo/ui/computeresource.py @@ -198,23 +198,40 @@ def list_images(self, res_name): images = self.browser.find_elements_by_xpath( #"//table[contains(@id, 'DataTables')]/tbody//tr/td[1]") #"//table[contains(@id, 'DataTables')]/tbody/tr/*[1]") + #TODO what about multiple pages? I need some paginator "//table[contains(@id, 'DataTables_Table_0')]/tbody/tr/*[1]") return images - def vm_action_start(self, res_name, vm_name): + def vm_action_stop(self, res_name, vm_name, really): self.go_to_compute_resource(res_name) self.click(locators['resource.virtual_machines_tab']) - pass + strategy, value = locators['resource.vm.power_off_button'] + locator = (strategy, value % vm_name) + self.click(locator, wait_for_ajax=False) + self.handle_alert(really) + #TODO wait for message - def vm_action_stop(self, res_name, vm_name): + def vm_action_start(self, res_name, vm_name): self.go_to_compute_resource(res_name) self.click(locators['resource.virtual_machines_tab']) - pass + strategy, value = locators['resource.vm.power_on_button'] + locator = (strategy, value % vm_name) + self.click(locator, wait_for_ajax=False) + #TODO wait for message - def vm_action_toggle(self, res_name, vm_name): + def vm_action_toggle(self, res_name, vm_name, really): self.go_to_compute_resource(res_name) self.click(locators['resource.virtual_machines_tab']) - pass + strategy, value = locators['resource.vm.toggle'] + locator = (strategy, value % (res_name, vm_name)) + button = self.find_element(locator) + if "On" in button.text: + self.click(locator,wait_for_ajax=False) + #TODO wait for message + else: + self.click(locator, wait_for_ajax=False) + self.handle_alert(really) + #TODO wait for message def list_compute_profiles(self): pass \ No newline at end of file diff --git a/robottelo/ui/locators.py b/robottelo/ui/locators.py index e4be7b9bbf9..b157b61bd27 100644 --- a/robottelo/ui/locators.py +++ b/robottelo/ui/locators.py @@ -887,6 +887,21 @@ def __iter__(self): #"//a[not(contains(@data-id, 'edit')) and contains(@href, '%s')]" "//a[not(contains(@href, 'search')) and contains(@href, '%s')]" ), + #TODO see power_on + "resource.vm.power_off_button": ( + By.XPATH, "//a[contains(@data-confirm," + "'Are you sure you want to power off %s?')]" + ), + #TODO needs to be done with NTH + "resource.vm.power_on_button": ( + By.XPATH, "//a[contains(@data-confirm," + "'Are you sure you want to power on %s?')]" + ), + "resource.vm.toggle": ( + By.XPATH, + #"//table[contains(@id, 'DataTables')]//a[contains(@data-id, '%s')]/../../*[5]//a" + "//table[contains(@id, 'DataTables')]//a[contains(@data-id, '%s') and .='%s']/../../td[5]//a" + ), # Hosts diff --git a/tests/foreman/rhci/test_computeresources.py b/tests/foreman/rhci/test_computeresources.py index c744a002d78..11a3a813d73 100644 --- a/tests/foreman/rhci/test_computeresources.py +++ b/tests/foreman/rhci/test_computeresources.py @@ -125,9 +125,15 @@ def test_retrieve_template_list(self): print "Image: %s" % item.text self.compute_resource.delete(self.rhev_name) - """ + vm_name = "apagac2-cfme" + def test_vm_start_stop(self): - pass + with Session(self.browser) as session: + #make_resource + #self.compute_resource.vm_action_stop(self.rhev_name, self.vm_name, True) + #self.compute_resource.vm_action_start(self.rhev_name, self.vm_name) + self.compute_resource.vm_action_toggle(self.rhev_name, self.vm_name, True) + """ def test_delete_vm(self): pass From 5143f562f3ab7d85db1507f676536acdb5e224b5 Mon Sep 17 00:00:00 2001 From: Antonin Pagac Date: Sun, 4 Oct 2015 11:31:03 +0200 Subject: [PATCH 13/20] starting the delete test --- robottelo/ui/computeresource.py | 41 ++++++++++++++++----- robottelo/ui/locators.py | 15 ++------ tests/foreman/rhci/test_computeresources.py | 33 +++++++++++++++-- 3 files changed, 64 insertions(+), 25 deletions(-) diff --git a/robottelo/ui/computeresource.py b/robottelo/ui/computeresource.py index 3c1a52f9d62..254a89d51c3 100644 --- a/robottelo/ui/computeresource.py +++ b/robottelo/ui/computeresource.py @@ -205,24 +205,42 @@ def list_images(self, res_name): def vm_action_stop(self, res_name, vm_name, really): self.go_to_compute_resource(res_name) self.click(locators['resource.virtual_machines_tab']) - strategy, value = locators['resource.vm.power_off_button'] - locator = (strategy, value % vm_name) - self.click(locator, wait_for_ajax=False) - self.handle_alert(really) - #TODO wait for message + #strategy, value = locators['resource.vm.power_off_button'] + strategy, value = locators['resource.vm.power_button'] + #locator = (strategy, value % vm_name) + locator = (strategy, value % (res_name, vm_name)) + button = self.find_element(locator) + if 'Off' in button.text: + self.click(locator, wait_for_ajax=False) + self.handle_alert(really) + #TODO wait for message + else: + pass + #TODO raise exception VM is not running + #self.click(locator, wait_for_ajax=False) + #self.handle_alert(really) + def vm_action_start(self, res_name, vm_name): self.go_to_compute_resource(res_name) self.click(locators['resource.virtual_machines_tab']) - strategy, value = locators['resource.vm.power_on_button'] - locator = (strategy, value % vm_name) - self.click(locator, wait_for_ajax=False) - #TODO wait for message + #strategy, value = locators['resource.vm.power_on_button'] + #locator = (strategy, value % vm_name) + strategy, value = locators['resource.vm.power_button'] + locator = (strategy, value % (res_name, vm_name)) + button = self.find_element(locator) + if 'On' in button.text: + self.click(locator,wait_for_ajax=False) + #TODO wait for message + else: + pass + #TODO raise exception VM is already running + #self.click(locator, wait_for_ajax=False) def vm_action_toggle(self, res_name, vm_name, really): self.go_to_compute_resource(res_name) self.click(locators['resource.virtual_machines_tab']) - strategy, value = locators['resource.vm.toggle'] + strategy, value = locators['resource.vm.power_button'] locator = (strategy, value % (res_name, vm_name)) button = self.find_element(locator) if "On" in button.text: @@ -233,5 +251,8 @@ def vm_action_toggle(self, res_name, vm_name, really): self.handle_alert(really) #TODO wait for message + def vm_delete(self, res_name, vm_name, really): + pass + def list_compute_profiles(self): pass \ No newline at end of file diff --git a/robottelo/ui/locators.py b/robottelo/ui/locators.py index b157b61bd27..1d7874a1215 100644 --- a/robottelo/ui/locators.py +++ b/robottelo/ui/locators.py @@ -887,21 +887,14 @@ def __iter__(self): #"//a[not(contains(@data-id, 'edit')) and contains(@href, '%s')]" "//a[not(contains(@href, 'search')) and contains(@href, '%s')]" ), - #TODO see power_on - "resource.vm.power_off_button": ( - By.XPATH, "//a[contains(@data-confirm," - "'Are you sure you want to power off %s?')]" - ), - #TODO needs to be done with NTH - "resource.vm.power_on_button": ( - By.XPATH, "//a[contains(@data-confirm," - "'Are you sure you want to power on %s?')]" - ), - "resource.vm.toggle": ( + "resource.vm.power_button": ( By.XPATH, #"//table[contains(@id, 'DataTables')]//a[contains(@data-id, '%s')]/../../*[5]//a" "//table[contains(@id, 'DataTables')]//a[contains(@data-id, '%s') and .='%s']/../../td[5]//a" ), + resource.vm.delete_button: ( + + ), # Hosts diff --git a/tests/foreman/rhci/test_computeresources.py b/tests/foreman/rhci/test_computeresources.py index 11a3a813d73..588f18777d9 100644 --- a/tests/foreman/rhci/test_computeresources.py +++ b/tests/foreman/rhci/test_computeresources.py @@ -125,19 +125,44 @@ def test_retrieve_template_list(self): print "Image: %s" % item.text self.compute_resource.delete(self.rhev_name) + #TODO need to set-up the VM on the resource vm_name = "apagac2-cfme" def test_vm_start_stop(self): with Session(self.browser) as session: #make_resource - #self.compute_resource.vm_action_stop(self.rhev_name, self.vm_name, True) - #self.compute_resource.vm_action_start(self.rhev_name, self.vm_name) - self.compute_resource.vm_action_toggle(self.rhev_name, self.vm_name, True) - """ + make_resource( + name=self.rhev_name, + provider_type=FOREMAN_PROVIDERS['rhev'], + parameter_list=[ + ['URL', self.rhev_hostname_api, 'field'], + ['Username', self.rhev_username, 'field'], + ['Password', self.rhev_password, 'field'], + ['Datacenter', self.rhev_datacenter, 'special select'] + ], + orgs=[self.default_org], + org_select=False, + locations=[self.default_loc], + loc_select=True + ) + #TODO assuming the VM is powered down when starting this test + #TODO RFE: find out the status of the VM + try: + self.compute_resource.vm_action_start(self.rhev_name, self.vm_name) + except ErrVMAlreadyRunning: + #TODO print an error message; continue + + try: + self.compute_resource.vm_action_stop(self.rhev_name, self.vm_name, True) + except ErrVMAlreadyDown: + #TODO print an error message + + self.compute_resource.delete(self.rhev_name) def test_delete_vm(self): pass + """ def test_add_image(self): pass From cc2ed2569f08f57601a10573480312ba05a32cd4 Mon Sep 17 00:00:00 2001 From: Antonin Pagac Date: Sun, 4 Oct 2015 12:26:28 +0200 Subject: [PATCH 14/20] refactor; exceptions; wait for notif --- robottelo/ui/computeresource.py | 27 +++++++++++---------- robottelo/ui/locators.py | 4 +-- tests/foreman/rhci/test_computeresources.py | 13 ++-------- 3 files changed, 18 insertions(+), 26 deletions(-) diff --git a/robottelo/ui/computeresource.py b/robottelo/ui/computeresource.py index 254a89d51c3..c0bee0742ce 100644 --- a/robottelo/ui/computeresource.py +++ b/robottelo/ui/computeresource.py @@ -1,6 +1,6 @@ # -*- encoding: utf-8 -*- from robottelo.common.constants import FILTER -from robottelo.ui.base import Base, UINoSuchElementError +from robottelo.ui.base import Base, UINoSuchElementError, UIError from robottelo.ui.locators import common_locators, locators, tab_locators from robottelo.ui.navigator import Navigator from selenium.webdriver.support.select import Select @@ -152,10 +152,12 @@ def delete(self, name, really=True): drop_locator=locators['resource.dropdown'] ) - #TODO internal method def go_to_compute_resource(self, res_name): resource = self.search(res_name) #TODO if not found + if resource is None: + raise UINoSuchElementError( + 'Could not find the resource {0}'.format(res_name)) strategy, value = locators['resource.get_by_name'] locator = (strategy, value % res_name) self.click(locator) @@ -173,7 +175,6 @@ def list_vms(self, res_name): """ self.go_to_compute_resource(res_name) self.click(locators['resource.virtual_machines_tab']) - #TODO if not foud #vms = self.find_element(locators['resource.virtual_machines']) vms = self.browser.find_elements_by_xpath( #TODO needs correcting, see list_images @@ -194,7 +195,6 @@ def list_images(self, res_name): """ self.go_to_compute_resource(res_name) self.click(locators['resource.images_tab']) - #TODO if not found images = self.browser.find_elements_by_xpath( #"//table[contains(@id, 'DataTables')]/tbody//tr/td[1]") #"//table[contains(@id, 'DataTables')]/tbody/tr/*[1]") @@ -213,12 +213,13 @@ def vm_action_stop(self, res_name, vm_name, really): if 'Off' in button.text: self.click(locator, wait_for_ajax=False) self.handle_alert(really) - #TODO wait for message + self.wait_until_element(common_locators['notif.success']) + #element = self.find_element(common_locators['notif.success']) + #print element.text else: - pass - #TODO raise exception VM is not running - #self.click(locator, wait_for_ajax=False) - #self.handle_alert(really) + raise UIError( + 'Could not stop VM {0}. VM is not running'.format(vm_name) + ) def vm_action_start(self, res_name, vm_name): @@ -231,11 +232,11 @@ def vm_action_start(self, res_name, vm_name): button = self.find_element(locator) if 'On' in button.text: self.click(locator,wait_for_ajax=False) - #TODO wait for message + self.wait_until_element(common_locators['notif.success']) else: - pass - #TODO raise exception VM is already running - #self.click(locator, wait_for_ajax=False) + raise UIError( + 'Could not start VM {0}. VM is already running'.format(vm_name) + ) def vm_action_toggle(self, res_name, vm_name, really): self.go_to_compute_resource(res_name) diff --git a/robottelo/ui/locators.py b/robottelo/ui/locators.py index 1d7874a1215..c3f33b62f1e 100644 --- a/robottelo/ui/locators.py +++ b/robottelo/ui/locators.py @@ -892,8 +892,8 @@ def __iter__(self): #"//table[contains(@id, 'DataTables')]//a[contains(@data-id, '%s')]/../../*[5]//a" "//table[contains(@id, 'DataTables')]//a[contains(@data-id, '%s') and .='%s']/../../td[5]//a" ), - resource.vm.delete_button: ( - + "resource.vm.delete_button": ( + "" ), # Hosts diff --git a/tests/foreman/rhci/test_computeresources.py b/tests/foreman/rhci/test_computeresources.py index 588f18777d9..526f6db158d 100644 --- a/tests/foreman/rhci/test_computeresources.py +++ b/tests/foreman/rhci/test_computeresources.py @@ -130,7 +130,6 @@ def test_retrieve_template_list(self): def test_vm_start_stop(self): with Session(self.browser) as session: - #make_resource make_resource( name=self.rhev_name, provider_type=FOREMAN_PROVIDERS['rhev'], @@ -147,16 +146,8 @@ def test_vm_start_stop(self): ) #TODO assuming the VM is powered down when starting this test #TODO RFE: find out the status of the VM - try: - self.compute_resource.vm_action_start(self.rhev_name, self.vm_name) - except ErrVMAlreadyRunning: - #TODO print an error message; continue - - try: - self.compute_resource.vm_action_stop(self.rhev_name, self.vm_name, True) - except ErrVMAlreadyDown: - #TODO print an error message - + self.compute_resource.vm_action_start(self.rhev_name, self.vm_name) + self.compute_resource.vm_action_stop(self.rhev_name, self.vm_name, True) self.compute_resource.delete(self.rhev_name) def test_delete_vm(self): From 831e00cfcffa3b7de322dc14a6a33bd701fc660f Mon Sep 17 00:00:00 2001 From: Antonin Pagac Date: Sun, 4 Oct 2015 12:55:45 +0200 Subject: [PATCH 15/20] vm delete works --- robottelo/ui/computeresource.py | 12 ++++++++++- robottelo/ui/locators.py | 7 ++++++- tests/foreman/rhci/test_computeresources.py | 23 ++++++++++++++++++++- 3 files changed, 39 insertions(+), 3 deletions(-) diff --git a/robottelo/ui/computeresource.py b/robottelo/ui/computeresource.py index c0bee0742ce..f98b0690da6 100644 --- a/robottelo/ui/computeresource.py +++ b/robottelo/ui/computeresource.py @@ -253,7 +253,17 @@ def vm_action_toggle(self, res_name, vm_name, really): #TODO wait for message def vm_delete(self, res_name, vm_name, really): - pass + self.go_to_compute_resource(res_name) + self.click(locators['resource.virtual_machines_tab']) + #TODO this is power button dropdown + strategy, value = locators['resource.vm.delete_button_dropdown'] + locator = (strategy, value % (res_name, vm_name)) + self.click(locator) + strategy, value = locators['resource.vm.delete_button'] + locator = (strategy, value % (res_name, vm_name)) + self.click(locator, wait_for_ajax=False) + self.handle_alert(really) + self.wait_until_element(common_locators['notif.success']) def list_compute_profiles(self): pass \ No newline at end of file diff --git a/robottelo/ui/locators.py b/robottelo/ui/locators.py index c3f33b62f1e..95d654061d9 100644 --- a/robottelo/ui/locators.py +++ b/robottelo/ui/locators.py @@ -892,8 +892,13 @@ def __iter__(self): #"//table[contains(@id, 'DataTables')]//a[contains(@data-id, '%s')]/../../*[5]//a" "//table[contains(@id, 'DataTables')]//a[contains(@data-id, '%s') and .='%s']/../../td[5]//a" ), + "resource.vm.delete_button_dropdown": ( + By.XPATH, + "//table[contains(@id, 'DataTables')]//a[contains(@data-id, '%s') and .='%s']/../../td[5]//a[2]" + ), "resource.vm.delete_button": ( - "" + By.XPATH, + "//table[contains(@id, 'DataTables')]//a[contains(@data-id, '%s') and .='%s']/../../td[5]//a[.='Delete']" ), # Hosts diff --git a/tests/foreman/rhci/test_computeresources.py b/tests/foreman/rhci/test_computeresources.py index 526f6db158d..063755a6d01 100644 --- a/tests/foreman/rhci/test_computeresources.py +++ b/tests/foreman/rhci/test_computeresources.py @@ -108,6 +108,7 @@ def test_retrieve_vm_list(self): def test_retrieve_template_list(self): with Session(self.browser) as session: make_resource( + session, name=self.rhev_name, provider_type=FOREMAN_PROVIDERS['rhev'], parameter_list=[ @@ -131,6 +132,7 @@ def test_retrieve_template_list(self): def test_vm_start_stop(self): with Session(self.browser) as session: make_resource( + session, name=self.rhev_name, provider_type=FOREMAN_PROVIDERS['rhev'], parameter_list=[ @@ -151,7 +153,26 @@ def test_vm_start_stop(self): self.compute_resource.delete(self.rhev_name) def test_delete_vm(self): - pass + with Session(self.browser) as session: + make_resource( + session, + name=self.rhev_name, + provider_type=FOREMAN_PROVIDERS['rhev'], + parameter_list=[ + ['URL', self.rhev_hostname_api, 'field'], + ['Username', self.rhev_username, 'field'], + ['Password', self.rhev_password, 'field'], + ['Datacenter', self.rhev_datacenter, 'special select'] + ], + orgs=[self.default_org], + org_select=False, + locations=[self.default_loc], + loc_select=True + ) + self.compute_resource.vm_delete(self.rhev_name, + self.vm_name, + True) + self.compute_resource.delete(self.rhev_name) """ def test_add_image(self): From 67c2e32a01aa4d0dae0028bc50262fe82ce0557f Mon Sep 17 00:00:00 2001 From: Antonin Pagac Date: Mon, 5 Oct 2015 13:03:40 +0200 Subject: [PATCH 16/20] create resource for all providers --- tests/foreman/rhci/test_computeresources.py | 74 +++++++++++++++++++-- 1 file changed, 70 insertions(+), 4 deletions(-) diff --git a/tests/foreman/rhci/test_computeresources.py b/tests/foreman/rhci/test_computeresources.py index 063755a6d01..97861d15dc4 100644 --- a/tests/foreman/rhci/test_computeresources.py +++ b/tests/foreman/rhci/test_computeresources.py @@ -17,7 +17,7 @@ class ComputeResourceTestCase(UITestCase): rhev_username = conf.properties['rhev.username'] rhev_password = conf.properties['rhev.password'] rhev_datacenter = conf.properties['rhev.datacenter'] - + #TODO for development purposes def test_create_delete_rhev_compute_resource(self): with Session(self.browser) as session: make_resource( @@ -41,8 +41,34 @@ def test_create_delete_rhev_compute_resource(self): #search = self.compute_resource.search(self.rhev_name) #self.assertIsNone(search) - #def test_create_vmware_compute_resource(self): - # pass + vmware_name = conf.properties['vmware.name'] + vmware_vcenter = conf.properties['vmware.vcenter'] + vmware_username = conf.properties['vmware.username'] + vmware_password = conf.properties['vmware.password'] + vmware_datacenter = conf.properties['vmware.datacenter'] + #TODO for development purposes + def test_create_vmware_compute_resource(self): + with Session(self.browser) as session: + make_resource( + session, + name=self.vmware_name, + provider_type=FOREMAN_PROVIDERS['vmware'], + parameter_list=[ + ['VCenter/Server', self.vmware_vcenter, 'field'], + ['Username', self.vmware_username, 'field'], + ['Password', self.vmware_password, 'field'], + ['Datacenter', self.vmware_datacenter, 'special select'] + ], + orgs=[self.default_org], + org_select=False, + locations=[self.default_loc], + loc_select=True + ) + search = self.compute_resource.search(self.vmware_name) + self.assertIsNotNone(search) + #self.compute_resource.delete(self.vmware_name) + #search = self.compute_resource.search(self.vmware_name) + #self.assertIsNone(search) #def test_create_osp_compute_resource(self): # pass @@ -50,6 +76,47 @@ def test_create_delete_rhev_compute_resource(self): #def test_create_docker_compute_resource(self): # pass + @data( + {'name': rhev_name, + 'provider': FOREMAN_PROVIDERS['rhev'], + 'url': rhev_hostname_api, + 'username': rhev_username, + 'password': rhev_password, + 'datacenter': rhev_datacenter, + #this is the name of the URL field for rhev + 'url_name': 'URL'}, + {'name': vmware_name, + 'provider': FOREMAN_PROVIDERS['vmware'], + 'url': vmware_vcenter, + 'username': vmware_username, + 'password': vmware_password, + 'datacenter': vmware_datacenter, + #this is the name of the URL field for vmware + 'url_name': 'VCenter/Server'} + ) + def test_create_compute_resource(self): + with Session(self.browser) as session: + make_resource( + session, + name=data['name'], + provider_type=data['provider'], + parameter_list=[ + [data['url_name'], data['url'], 'field'], + ['Username', data['username'], 'field'], + ['Password', data['password'], 'field'], + ['Datacenter', data['datacenter'], 'special select'] + ], + orgs=[self.default_org], + org_select=False, + locations=[self.default_loc], + loc_select=True + ) + search = self.compute_resource.search(data['name']) + self.assertIsNotNone(search) + self.compute_resource.delete(data['name']) + search = self.compute_resource.search(data['name']) + self.assertIsNone(search) + @data( {'name': rhev_name, 'new_name': '%s-updated' % rhev_name}, @@ -82,7 +149,6 @@ def test_edit_compute_resource(self, data): self.compute_resource.delete(data['new_name']) self.assertIsNone(search) - def test_retrieve_vm_list(self): with Session(self.browser) as session: make_resource( From 515d40f576b9fe9dfd3b2ddff671da15f6b78839 Mon Sep 17 00:00:00 2001 From: Antonin Pagac Date: Mon, 5 Oct 2015 14:47:30 +0200 Subject: [PATCH 17/20] add image works --- robottelo/ui/computeresource.py | 24 ++++++++++++++-- robottelo/ui/locators.py | 32 +++++++++++++++++++++ tests/foreman/rhci/test_computeresources.py | 22 ++++++++++++-- 3 files changed, 74 insertions(+), 4 deletions(-) diff --git a/robottelo/ui/computeresource.py b/robottelo/ui/computeresource.py index f98b0690da6..a9f10ab94d3 100644 --- a/robottelo/ui/computeresource.py +++ b/robottelo/ui/computeresource.py @@ -181,8 +181,28 @@ def list_vms(self, res_name): "//table[contains(@id, 'DataTables')]//a[contains(@data-id, '%s')]" % res_name) return vms - def add_image(self): - pass + def add_image(self, res_name, parameter_list): + self.go_to_compute_resource(res_name) + #self.click(locators['resource.images_tab']) + #self.wait_until_element(locators['resource.image.add']) + self.click(locators['resource.image.add']) + self.wait_until_element(locators['resource.image.name']) + if parameter_list is None: + return + for parameter_name, parameter_value, parameter_type in parameter_list: + param_locator = '.'.join(( + 'resource.image', + (parameter_name.lower()).replace(' ', '_') + )) + if parameter_type == 'field': + self.find_element( + locators[param_locator]).send_keys(parameter_value) + elif parameter_type == 'select': + Select( + self.find_element(locators[param_locator]) + ).select_by_visible_text(parameter_value) + self.click(locators['resource.image.submit']) + self.wait_until_element(common_locators['notif.success']) def list_images(self, res_name): """ diff --git a/robottelo/ui/locators.py b/robottelo/ui/locators.py index 95d654061d9..2ca7b91a580 100644 --- a/robottelo/ui/locators.py +++ b/robottelo/ui/locators.py @@ -900,6 +900,38 @@ def __iter__(self): By.XPATH, "//table[contains(@id, 'DataTables')]//a[contains(@data-id, '%s') and .='%s']/../../td[5]//a[.='Delete']" ), + "resource.image.add": ( + By.XPATH, + "//a[.='New Image']" + ), + "resource.image.name": ( + By.ID, + "image_name" + ), + "resource.image.operatingsystem": ( + By.XPATH, + "//select[@id='image_operatingsystem_id']" + ), + "resource.image.architecture": ( + By.XPATH, + "//select[@id='image_architecture_id']" + ), + "resource.image.username": ( + By.ID, + "image_username" + ), + "resource.image.password": ( + By.ID, + "image_password" + ), + "resource.image.image": ( + By.XPATH, + "//select[@id='image_uuid']" + ), + "resource.image.submit": ( + By.XPATH, + "//input[@data-id='aid_create_image']" + ), # Hosts diff --git a/tests/foreman/rhci/test_computeresources.py b/tests/foreman/rhci/test_computeresources.py index 97861d15dc4..cb3c7cb0536 100644 --- a/tests/foreman/rhci/test_computeresources.py +++ b/tests/foreman/rhci/test_computeresources.py @@ -240,10 +240,28 @@ def test_delete_vm(self): True) self.compute_resource.delete(self.rhev_name) - """ + res = rhev_name + image_name = 'test_auto_img' + os = 'CentOS 6.6' + arch = 'i386' + uname = 'testing' + passw = 'testing' + img = 'Blank' + def test_add_image(self): - pass + with Session(self.browser)as session: + #make_resource + parameter_list=[ + ['Name', self.image_name, 'field'], + ['Operatingsystem', self.os, 'select'], + ['Architecture', self.arch, 'select'], + ['Username', self.uname, 'field'], + ['Password', self.passw, 'field'], + ['Image', self.img, 'select'] + ] + self.compute_resource.add_image(self.res, parameter_list) + """ def test_delete_image(self): pass From a2175ad52b6af6fa4e60db37c320ae6ffbbabc13 Mon Sep 17 00:00:00 2001 From: Antonin Pagac Date: Thu, 8 Oct 2015 10:11:50 +0200 Subject: [PATCH 18/20] misc --- robottelo/ui/locators.py | 4 ++++ tests/foreman/rhci/test_computeresources.py | 1 + 2 files changed, 5 insertions(+) diff --git a/robottelo/ui/locators.py b/robottelo/ui/locators.py index 2ca7b91a580..e1618be2ece 100644 --- a/robottelo/ui/locators.py +++ b/robottelo/ui/locators.py @@ -932,6 +932,10 @@ def __iter__(self): By.XPATH, "//input[@data-id='aid_create_image']" ), + "resource.image.delete": ( + By.XPATH, + "" + ), # Hosts diff --git a/tests/foreman/rhci/test_computeresources.py b/tests/foreman/rhci/test_computeresources.py index cb3c7cb0536..2360fd4ebd6 100644 --- a/tests/foreman/rhci/test_computeresources.py +++ b/tests/foreman/rhci/test_computeresources.py @@ -260,6 +260,7 @@ def test_add_image(self): ['Image', self.img, 'select'] ] self.compute_resource.add_image(self.res, parameter_list) + #TODO do a search, verify image exists """ def test_delete_image(self): From dd236959d4d886bca3cbdaffac4a2046cafadb9a Mon Sep 17 00:00:00 2001 From: Antonin Pagac Date: Fri, 30 Oct 2015 12:34:23 +0100 Subject: [PATCH 19/20] major overhaul --- robottelo.properties.sample | 53 ++++ robottelo/ui/computeresource.py | 56 ++-- tests/foreman/rhci/test_computeresources.py | 334 ++++++++------------ 3 files changed, 208 insertions(+), 235 deletions(-) diff --git a/robottelo.properties.sample b/robottelo.properties.sample index 9a39560b94e..0ece6aee0d8 100644 --- a/robottelo.properties.sample +++ b/robottelo.properties.sample @@ -70,12 +70,65 @@ rhel7_repo=http://example.com/yum/repo_files/rhel7-updates.repo external_url=http://localhost:2375 [rhev] +# External RHEV to be added as a compute resource. +# name: Name of the RHEV compute resource +# hostname: RHEV API URL, for example: https://ovirt.example.com/api +# username: Login for RHEVM +# password: Password for RHEVM +# datacenter: RHEVM datacenter, for example: Default name= hostname= username= password= datacenter= +# vm_name: Name of VM to power On/Off & delete +vm_name= + +# Compute resource image data +# img_name: Chosen name of the image +# img_os: Operating system of the image +# img_arch: Architecture of the image +# img_username: Login to the image +# img_password: Password to the image +# img_image: Image on the external provider +img_name= +img_os= +img_arch= +img_username= +img_password= +img_image= + +[vmware] +# External Vmware to be added as a compute resource +# name: Name of the vmware compute resource +# vcenter: vmware vcenter URL +# username: Login for vmware +# password: Password for vmware +# datacenter: vmware datacenter +name= +vcenter= +username= +password= +datacenter= + +# vm_name: Name of VM to power On/Off & delete +vm_name= + +# Compute resource image data +# img_name: Chosen name of the image +# img_os: Operating system of the image +# img_arch: Architecture of the image +# img_username: Login to the image +# img_password: Password to the image +# img_image: Image on the external provider +img_name= +img_os= +img_arch= +img_username= +img_password= +img_image= + [foreman] admin.username=admin admin.password=changeme diff --git a/robottelo/ui/computeresource.py b/robottelo/ui/computeresource.py index a9f10ab94d3..7752bea6ed1 100644 --- a/robottelo/ui/computeresource.py +++ b/robottelo/ui/computeresource.py @@ -142,7 +142,6 @@ def update(self, name, newname=None, parameter_list=None, def delete(self, name, really=True): """Removes the compute resource entity""" - #TODO added to make delete work when called with different context Navigator(self.browser).go_to_compute_resources() self.delete_entity( name, @@ -153,38 +152,31 @@ def delete(self, name, really=True): ) def go_to_compute_resource(self, res_name): + """ Navigates to compute resource page """ resource = self.search(res_name) - #TODO if not found if resource is None: raise UINoSuchElementError( 'Could not find the resource {0}'.format(res_name)) strategy, value = locators['resource.get_by_name'] locator = (strategy, value % res_name) self.click(locator) - #TODO consider better object to wait for self.wait_until_element(locators['resource.virtual_machines_tab']) def list_vms(self, res_name): - """ - resource = self.search(res_name) - #TODO if not found - strategy, value = locators['resource.get_by_name'] - locator = (strategy, value % res_name) - self.click(locator) - self.wait_until_element(locators['resource.virtual_machines_tab']) + """ Lists vms on compute resource + + note: lists only vms that show up on the first page """ self.go_to_compute_resource(res_name) self.click(locators['resource.virtual_machines_tab']) - #vms = self.find_element(locators['resource.virtual_machines']) vms = self.browser.find_elements_by_xpath( - #TODO needs correcting, see list_images - "//table[contains(@id, 'DataTables')]//a[contains(@data-id, '%s')]" % res_name) + "//table[contains(@id, 'DataTables')]//a[contains(@data-id, '%s')]" + % res_name) return vms def add_image(self, res_name, parameter_list): + """ Adds an image to a compute resource """ self.go_to_compute_resource(res_name) - #self.click(locators['resource.images_tab']) - #self.wait_until_element(locators['resource.image.add']) self.click(locators['resource.image.add']) self.wait_until_element(locators['resource.image.name']) if parameter_list is None: @@ -205,53 +197,43 @@ def add_image(self, res_name, parameter_list): self.wait_until_element(common_locators['notif.success']) def list_images(self, res_name): - """ - resource = self.search(res_name) - #TODO if not found - strategy, value = locators['resource.get_by_name'] - locator = (strategy, value % res_name) - self.click(locator) - self.wait_until_element(locators['resource.images_tab']) + """ Lists images on compute resource + + note: lists only images that show up on the first page """ self.go_to_compute_resource(res_name) self.click(locators['resource.images_tab']) images = self.browser.find_elements_by_xpath( - #"//table[contains(@id, 'DataTables')]/tbody//tr/td[1]") - #"//table[contains(@id, 'DataTables')]/tbody/tr/*[1]") - #TODO what about multiple pages? I need some paginator "//table[contains(@id, 'DataTables_Table_0')]/tbody/tr/*[1]") return images def vm_action_stop(self, res_name, vm_name, really): + """ Stops a vm on the compute resource """ self.go_to_compute_resource(res_name) self.click(locators['resource.virtual_machines_tab']) - #strategy, value = locators['resource.vm.power_off_button'] strategy, value = locators['resource.vm.power_button'] - #locator = (strategy, value % vm_name) locator = (strategy, value % (res_name, vm_name)) button = self.find_element(locator) if 'Off' in button.text: self.click(locator, wait_for_ajax=False) self.handle_alert(really) + #note: this should probably have a timeout self.wait_until_element(common_locators['notif.success']) - #element = self.find_element(common_locators['notif.success']) - #print element.text else: raise UIError( 'Could not stop VM {0}. VM is not running'.format(vm_name) ) - def vm_action_start(self, res_name, vm_name): + """ Starts a vm on the compute resource """ self.go_to_compute_resource(res_name) self.click(locators['resource.virtual_machines_tab']) - #strategy, value = locators['resource.vm.power_on_button'] - #locator = (strategy, value % vm_name) strategy, value = locators['resource.vm.power_button'] locator = (strategy, value % (res_name, vm_name)) button = self.find_element(locator) if 'On' in button.text: self.click(locator,wait_for_ajax=False) + #note: this should probably have a timeout self.wait_until_element(common_locators['notif.success']) else: raise UIError( @@ -259,6 +241,7 @@ def vm_action_start(self, res_name, vm_name): ) def vm_action_toggle(self, res_name, vm_name, really): + """ Toggle power status of a vm on the compute resource """ self.go_to_compute_resource(res_name) self.click(locators['resource.virtual_machines_tab']) strategy, value = locators['resource.vm.power_button'] @@ -266,16 +249,16 @@ def vm_action_toggle(self, res_name, vm_name, really): button = self.find_element(locator) if "On" in button.text: self.click(locator,wait_for_ajax=False) - #TODO wait for message + self.wait_until_element(common_locators['notif.success']) else: self.click(locator, wait_for_ajax=False) self.handle_alert(really) - #TODO wait for message + self.wait_until_element(common_locators['notif.success']) def vm_delete(self, res_name, vm_name, really): + """ Removes a vm from the compute resource """ self.go_to_compute_resource(res_name) self.click(locators['resource.virtual_machines_tab']) - #TODO this is power button dropdown strategy, value = locators['resource.vm.delete_button_dropdown'] locator = (strategy, value % (res_name, vm_name)) self.click(locator) @@ -284,6 +267,3 @@ def vm_delete(self, res_name, vm_name, really): self.click(locator, wait_for_ajax=False) self.handle_alert(really) self.wait_until_element(common_locators['notif.success']) - - def list_compute_profiles(self): - pass \ No newline at end of file diff --git a/tests/foreman/rhci/test_computeresources.py b/tests/foreman/rhci/test_computeresources.py index 2360fd4ebd6..57ab9212940 100644 --- a/tests/foreman/rhci/test_computeresources.py +++ b/tests/foreman/rhci/test_computeresources.py @@ -8,7 +8,6 @@ @ddt class ComputeResourceTestCase(UITestCase): - #TODO create this in config file default_org = 'Default Organization' default_loc = 'Default Location' @@ -17,64 +16,14 @@ class ComputeResourceTestCase(UITestCase): rhev_username = conf.properties['rhev.username'] rhev_password = conf.properties['rhev.password'] rhev_datacenter = conf.properties['rhev.datacenter'] - #TODO for development purposes - def test_create_delete_rhev_compute_resource(self): - with Session(self.browser) as session: - make_resource( - session, - name=self.rhev_name, - provider_type=FOREMAN_PROVIDERS['rhev'], - parameter_list=[ - ['URL', self.rhev_hostname_api, 'field'], - ['Username', self.rhev_username, 'field'], - ['Password', self.rhev_password, 'field'], - ['Datacenter', self.rhev_datacenter, 'special select'] - ], - orgs=[self.default_org], - org_select=False, - locations=[self.default_loc], - loc_select=True - ) - search = self.compute_resource.search(self.rhev_name) - self.assertIsNotNone(search) - #self.compute_resource.delete(self.rhev_name) - #search = self.compute_resource.search(self.rhev_name) - #self.assertIsNone(search) + rhev_vm_name=conf.properties['rhev.vm_name'] vmware_name = conf.properties['vmware.name'] vmware_vcenter = conf.properties['vmware.vcenter'] vmware_username = conf.properties['vmware.username'] vmware_password = conf.properties['vmware.password'] vmware_datacenter = conf.properties['vmware.datacenter'] - #TODO for development purposes - def test_create_vmware_compute_resource(self): - with Session(self.browser) as session: - make_resource( - session, - name=self.vmware_name, - provider_type=FOREMAN_PROVIDERS['vmware'], - parameter_list=[ - ['VCenter/Server', self.vmware_vcenter, 'field'], - ['Username', self.vmware_username, 'field'], - ['Password', self.vmware_password, 'field'], - ['Datacenter', self.vmware_datacenter, 'special select'] - ], - orgs=[self.default_org], - org_select=False, - locations=[self.default_loc], - loc_select=True - ) - search = self.compute_resource.search(self.vmware_name) - self.assertIsNotNone(search) - #self.compute_resource.delete(self.vmware_name) - #search = self.compute_resource.search(self.vmware_name) - #self.assertIsNone(search) - - #def test_create_osp_compute_resource(self): - # pass - - #def test_create_docker_compute_resource(self): - # pass + vmware_vm_name=conf.properties['vmware.vm_name'] @data( {'name': rhev_name, @@ -83,7 +32,7 @@ def test_create_vmware_compute_resource(self): 'username': rhev_username, 'password': rhev_password, 'datacenter': rhev_datacenter, - #this is the name of the URL field for rhev + #this is the label of the URL field for rhev 'url_name': 'URL'}, {'name': vmware_name, 'provider': FOREMAN_PROVIDERS['vmware'], @@ -91,10 +40,16 @@ def test_create_vmware_compute_resource(self): 'username': vmware_username, 'password': vmware_password, 'datacenter': vmware_datacenter, - #this is the name of the URL field for vmware + #this is the label of the URL field for vmware 'url_name': 'VCenter/Server'} ) - def test_create_compute_resource(self): + def test_create_compute_resource(self, data): + """ @Test: Create a compute resource. + + @Assert: A compute resource is created + + @Feature: Compute Resource + """ with Session(self.browser) as session: make_resource( session, @@ -113,132 +68,93 @@ def test_create_compute_resource(self): ) search = self.compute_resource.search(data['name']) self.assertIsNotNone(search) - self.compute_resource.delete(data['name']) - search = self.compute_resource.search(data['name']) - self.assertIsNone(search) @data( {'name': rhev_name, 'new_name': '%s-updated' % rhev_name}, - #{'name': 'vmware name'}, + {'name': vmware_name, + 'new_name': '%s-updated' % vmware_name} #{'name': 'osp name'}, #{'name': 'docker name'} ) def test_edit_compute_resource(self, data): - with Session(self.browser) as session: - make_resource( - session, - name=self.rhev_name, - provider_type=FOREMAN_PROVIDERS['rhev'], - parameter_list=[ - ['URL', self.rhev_hostname_api, 'field'], - ['Username', self.rhev_username, 'field'], - ['Password', self.rhev_password, 'field'], - ['Datacenter', self.rhev_datacenter, 'special select'] - ], - orgs=[self.default_org], - org_select=False, - locations=[self.default_loc], - loc_select=True - ) - search = self.compute_resource.search(self.rhev_name) - self.assertIsNotNone(search) - self.compute_resource.update(name=data['name'], newname=data['new_name']) - search = self.compute_resource.search(data['new_name']) - self.assertIsNotNone(search) - self.compute_resource.delete(data['new_name']) - self.assertIsNone(search) + """ @Test: Edit a compute resource. + + @Assert: A compute resource with new name exists + + @Feature: Compute Resource + """ + search = self.compute_resource.search(data['name']) + self.assertIsNotNone(search) + self.compute_resource.update(name=data['name'], + newname=data['new_name']) + search = self.compute_resource.search(data['new_name']) + self.assertIsNotNone(search) + self.compute_resource.update(name=data['new_name'], + newname=data['name']) + search = self.compute_resource.search(data['name']) + self.assertIsNotNone(search) - def test_retrieve_vm_list(self): - with Session(self.browser) as session: - make_resource( - session, - name=self.rhev_name, - provider_type=FOREMAN_PROVIDERS['rhev'], - parameter_list=[ - ['URL', self.rhev_hostname_api, 'field'], - ['Username', self.rhev_username, 'field'], - ['Password', self.rhev_password, 'field'], - ['Datacenter', self.rhev_datacenter, 'special select'] - ], - orgs=[self.default_org], - org_select=False, - locations=[self.default_loc], - loc_select=True - ) - for item in self.compute_resource.list_vms(self.rhev_name): - if item.text: - print "VM: %s" % item.text - self.compute_resource.delete(self.rhev_name) + @data( + {'name': rhev_name}, + {'name': vmware_name} + #{'name': 'osp name'}, + #{'name': 'docker name'} + ) + def test_retrieve_vm_list(self, data): + """ @Test: Retrieve list of VMs. - def test_retrieve_template_list(self): - with Session(self.browser) as session: - make_resource( - session, - name=self.rhev_name, - provider_type=FOREMAN_PROVIDERS['rhev'], - parameter_list=[ - ['URL', self.rhev_hostname_api, 'field'], - ['Username', self.rhev_username, 'field'], - ['Password', self.rhev_password, 'field'], - ['Datacenter', self.rhev_datacenter, 'special select'] - ], - orgs=[self.default_org], - org_select=False, - locations=[self.default_loc], - loc_select=True - ) - for item in self.compute_resource.list_images(self.rhev_name): - print "Image: %s" % item.text - self.compute_resource.delete(self.rhev_name) + @Feature: Compute Resource + """ + print "%s:" % data['name'] + for item in self.compute_resource.list_vms(data['name']): + if item.text: + print "VM: %s" % item.text - #TODO need to set-up the VM on the resource - vm_name = "apagac2-cfme" + @data( + {'name': rhev_name}, + {'name': vmware_name} + #{'name': 'osp name'}, + #{'name': 'docker name'} + ) + def test_retrieve_template_list(self, data): + """ @Test: Retrieve list of templates.. - def test_vm_start_stop(self): - with Session(self.browser) as session: - make_resource( - session, - name=self.rhev_name, - provider_type=FOREMAN_PROVIDERS['rhev'], - parameter_list=[ - ['URL', self.rhev_hostname_api, 'field'], - ['Username', self.rhev_username, 'field'], - ['Password', self.rhev_password, 'field'], - ['Datacenter', self.rhev_datacenter, 'special select'] - ], - orgs=[self.default_org], - org_select=False, - locations=[self.default_loc], - loc_select=True - ) - #TODO assuming the VM is powered down when starting this test - #TODO RFE: find out the status of the VM - self.compute_resource.vm_action_start(self.rhev_name, self.vm_name) - self.compute_resource.vm_action_stop(self.rhev_name, self.vm_name, True) - self.compute_resource.delete(self.rhev_name) + @Feature: Compute Resource + """ + print "%s:" % data['name'] + for item in self.compute_resource.list_images(data['name']): + print "Image: %s" % item.text - def test_delete_vm(self): - with Session(self.browser) as session: - make_resource( - session, - name=self.rhev_name, - provider_type=FOREMAN_PROVIDERS['rhev'], - parameter_list=[ - ['URL', self.rhev_hostname_api, 'field'], - ['Username', self.rhev_username, 'field'], - ['Password', self.rhev_password, 'field'], - ['Datacenter', self.rhev_datacenter, 'special select'] - ], - orgs=[self.default_org], - org_select=False, - locations=[self.default_loc], - loc_select=True - ) - self.compute_resource.vm_delete(self.rhev_name, - self.vm_name, - True) - self.compute_resource.delete(self.rhev_name) + @data( + {'name': rhev_name, + 'vm_name': rhev_vm_name}, + {'name': vmware_name, + 'vm_name': vmware_vm_name} + ) + def test_vm_start_stop(self, data): + """ @Test: Start & Stop a VM. + + @Feature: Compute Resource + + note: assuming the VM is powered down when starting this test + """ + self.compute_resource.vm_action_start(data['name'], data['vm_name']) + self.compute_resource.vm_action_stop(data['name'], data['vm_name'], + True) + + @data( + {'name': rhev_name, + 'vm_name': rhev_vm_name}, + {'name': vmware_name, + 'vm_name': vmware_vm_name} + ) + def test_delete_vm(self, data): + """ @Test: Deletes a VM. + + @Feature: Compute Resource + """ + self.compute_resource.vm_delete(data['name'], data['vm_name'], True) res = rhev_name image_name = 'test_auto_img' @@ -248,33 +164,57 @@ def test_delete_vm(self): passw = 'testing' img = 'Blank' - def test_add_image(self): - with Session(self.browser)as session: - #make_resource - parameter_list=[ - ['Name', self.image_name, 'field'], - ['Operatingsystem', self.os, 'select'], - ['Architecture', self.arch, 'select'], - ['Username', self.uname, 'field'], - ['Password', self.passw, 'field'], - ['Image', self.img, 'select'] - ] - self.compute_resource.add_image(self.res, parameter_list) - #TODO do a search, verify image exists - - """ - def test_delete_image(self): - pass - - def test_provision_image(self): - pass + @data( + {'name': rhev_name, + 'img_name': conf.properties['rhev.img_name'], + 'img_os': conf.properties['rhev.img_os'], + 'img_arch': conf.properties['rhev.img_arch'], + 'img_uname': conf.properties['rhev.img_username'], + 'img_passw': conf.properties['rhev.img_password'], + 'img_img': conf.properties['rhev.img_image']}, + {'name': vmware_name, + 'img_name': conf.properties['vmware.img_name'], + 'img_os': conf.properties['vmware.img_os'], + 'img_arch': conf.properties['vmware.img_arch'], + 'img_uname': conf.properties['vmware.img_username'], + 'img_passw': conf.properties['vmware.img_password'], + 'img_img': conf.properties['vmware.img_image']} + ) + def test_add_image(self, data): + """ @Test: Adds an image to compute resource. + + @Assert: Image added is on the first page + + @Feature: Compute Resource + """ + parameter_list=[ + ['Name', data['img_name'], 'field'], + ['Operatingsystem', data['img_os'], 'select'], + ['Architecture', data['img_arch'], 'select'], + ['Username', data['img_uname'], 'field'], + ['Password', data['img_passw'], 'field'], + ['Image', data['img_img'], 'select'] + ] + self.compute_resource.add_image(data['name'], parameter_list) + for item in self.compute_resource.list_images(data['name']): + if item.text == data['img_name']: + search = True + self.assertIsNotNone(search) - #default and custom compute profile - def test_provision_image_with_compute_profile(self): - pass - #to specific folder, static IP & custom spec, - # configure DNS & domain settings - def test_provision_vm(self): - pass - """ + @data( + {'name': rhev_name}, + {'name': vmware_name} + ) + def test_delete_compute_resource(self, data): + """ @Test: Edit a compute resource. + + @Assert: A compute resource with new name exists + + @Feature: Compute Resource + """ + search = self.compute_resource.search(data['name']) + self.assertIsNotNone(search) + self.compute_resource.delete(data['name']) + search = self.compute_resource.search(data['name']) + self.assertIsNone(search) \ No newline at end of file From 997701af15451e2c182d4100389f0b2daa233688 Mon Sep 17 00:00:00 2001 From: Antonin Pagac Date: Fri, 30 Oct 2015 16:43:41 +0100 Subject: [PATCH 20/20] fixes, but cr add doesn't work --- robottelo/ui/computeresource.py | 3 ++- robottelo/ui/locators.py | 5 +++++ tests/foreman/rhci/test_computeresources.py | 24 ++++++++++++--------- 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/robottelo/ui/computeresource.py b/robottelo/ui/computeresource.py index 7752bea6ed1..7df2e60beb5 100644 --- a/robottelo/ui/computeresource.py +++ b/robottelo/ui/computeresource.py @@ -112,7 +112,8 @@ def create(self, name, provider_type, parameter_list, self._configure_locations(locations, loc_select) if orgs: self._configure_orgs(orgs, org_select) - self.click(common_locators['submit']) + #self.click(common_locators['submit']) + self.click(common_locators['submit'], wait_for_ajax=False) def search(self, name): """Searches existing compute resource from UI.""" diff --git a/robottelo/ui/locators.py b/robottelo/ui/locators.py index e1618be2ece..b921c24498d 100644 --- a/robottelo/ui/locators.py +++ b/robottelo/ui/locators.py @@ -817,9 +817,14 @@ def __iter__(self): "resource.username": (By.ID, "compute_resource_user"), "resource.password": (By.ID, "compute_resource_password"), "resource.datacenter": (By.XPATH, "//select[@id='compute_resource_uuid']"), + "resource.datacenter_vsphere": (By.XPATH, "//select[@id='compute_resource_datacenter']"), "resource.datacenter.button": ( By.XPATH, "//a[contains(@data-url, '/compute_resources/test_connection')]"), + "resource.datacenter_vsphere.button": ( + By.XPATH, + "//a[contains(@data-url, '/compute_resources/test_connection')]"), + "resource.quota_id": ( By.XPATH, "//select[@id='compute_resource_ovirt_quota']"), "resource.x509_certification_authorities": ( diff --git a/tests/foreman/rhci/test_computeresources.py b/tests/foreman/rhci/test_computeresources.py index 57ab9212940..f5369a40dec 100644 --- a/tests/foreman/rhci/test_computeresources.py +++ b/tests/foreman/rhci/test_computeresources.py @@ -26,14 +26,16 @@ class ComputeResourceTestCase(UITestCase): vmware_vm_name=conf.properties['vmware.vm_name'] @data( - {'name': rhev_name, - 'provider': FOREMAN_PROVIDERS['rhev'], - 'url': rhev_hostname_api, - 'username': rhev_username, - 'password': rhev_password, - 'datacenter': rhev_datacenter, + #{'name': rhev_name, + # 'provider': FOREMAN_PROVIDERS['rhev'], + # 'url': rhev_hostname_api, + # 'username': rhev_username, + # 'password': rhev_password, + # 'datacenter': rhev_datacenter, #this is the label of the URL field for rhev - 'url_name': 'URL'}, + # 'url_name': 'URL', + #this is for RHEV datacenter locator + # 'dc_locator': 'datacenter'}, {'name': vmware_name, 'provider': FOREMAN_PROVIDERS['vmware'], 'url': vmware_vcenter, @@ -41,7 +43,9 @@ class ComputeResourceTestCase(UITestCase): 'password': vmware_password, 'datacenter': vmware_datacenter, #this is the label of the URL field for vmware - 'url_name': 'VCenter/Server'} + 'url_name': 'vcenterserver', + #this is for vmware datacenter locator + 'dc_locator': 'datacenter_vsphere'} ) def test_create_compute_resource(self, data): """ @Test: Create a compute resource. @@ -59,7 +63,7 @@ def test_create_compute_resource(self, data): [data['url_name'], data['url'], 'field'], ['Username', data['username'], 'field'], ['Password', data['password'], 'field'], - ['Datacenter', data['datacenter'], 'special select'] + [data['dc_locator'], data['datacenter'], 'special select'] ], orgs=[self.default_org], org_select=False, @@ -217,4 +221,4 @@ def test_delete_compute_resource(self, data): self.assertIsNotNone(search) self.compute_resource.delete(data['name']) search = self.compute_resource.search(data['name']) - self.assertIsNone(search) \ No newline at end of file + self.assertIsNone(search)