Breaking down region tests region tests will be run in smoke and regression. In smoke we only test the basic creation of a region. More extensive testing of duplicate regions, test for updating region atteributes is in component.
Separated the class for testing accounts within region (account sync) into a a new suite. Signed-off-by: Prasanna Santhanam <t...@apache.org> Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/548a8d8c Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/548a8d8c Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/548a8d8c Branch: refs/heads/planner_reserve Commit: 548a8d8c1f391812bb492b42704d21dd99ac59b7 Parents: 5ef2f1f Author: Prasanna Santhanam <t...@apache.org> Authored: Wed May 8 12:39:34 2013 +0530 Committer: Prasanna Santhanam <t...@apache.org> Committed: Wed May 8 13:50:04 2013 +0530 ---------------------------------------------------------------------- test/integration/component/test_regions.py | 469 +++------------ .../integration/component/test_regions_accounts.py | 206 +++++++ test/integration/smoke/test_regions.py | 93 +++ tools/marvin/marvin/integration/lib/base.py | 8 +- 4 files changed, 386 insertions(+), 390 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cloudstack/blob/548a8d8c/test/integration/component/test_regions.py ---------------------------------------------------------------------- diff --git a/test/integration/component/test_regions.py b/test/integration/component/test_regions.py index 1b24871..daf16cd 100644 --- a/test/integration/component/test_regions.py +++ b/test/integration/component/test_regions.py @@ -21,423 +21,120 @@ from marvin.cloudstackAPI import * from marvin.integration.lib.utils import * from marvin.integration.lib.base import * from marvin.integration.lib.common import * -from marvin import remoteSSHClient from nose.plugins.attrib import attr +from random import choice class Services: - """ - """ - def __init__(self): self.services = { - "domain": { - "name": "testuuid", - "domainUUID": "domain1" - }, - "account": { - "email": "t...@test.com", - "firstname": "Testuuid", - "lastname": "Useruuid", - "username": "test", - # Random characters are appended for unique - # username - "password": "password", - "accountUUID": "account1", - "userUUID": "user1" - }, - "user": { - "email": "t...@test.com", - "firstname": "Testuuid", - "lastname": "Useruuid", - "username": "test", - # Random characters are appended for unique - # username - "password": "password", - "userUUID": "user2" - }, - "ostype": 'CentOS 5.3 (64-bit)', - "region": { - "regionid": "2", - "regionname": "Region2", - "regionendpoint": "http://region2:8080/client" - } + "region": { + "regionid": "2", + "regionname": "Region2", + "regionendpoint": "http://region2:8080/client" + } } - class TestRegions(cloudstackTestCase): + """Test Regions - CRUD tests for regions """ - Testing Regions related Apis - """ + @classmethod def setUpClass(cls): cls.api_client = super(TestRegions, cls).getClsTestClient().getApiClient() cls.services = Services().services - cls.domain = get_domain(cls.api_client, cls.services) - cls.cleanup = [] + cls.domain = get_domain(cls.api_client, cls.services) + cls.cleanup = [] return - @attr(tags=["basic", "advanced"]) - def test_createAccountWithUUID(self): - """ - Test for creating Account by passing id parameter - - # Validate the following - # 1.Create an Account by passing id parameter.Verify the account is created. - # 2.List this account by passing id parameter.Verify that list account is able to lis this account. - # 3.Delete account should succeed. - - """ - account = Account.create( - self.api_client, - self.services["account"], - domainid=self.domain.id - ) - self.assertIn ( self.services["account"]["accountUUID"] , account.id, - "Account is not created with the accountId passed") - - list_account = Account.list(self.api_client, - id=account.id - ) - - self.assertEqual( - isinstance(list_account, list), - True, - "Check for list account response by uuid failed" - ) - - print (list_account) - - account_response = list_account[0] - - print (account_response) - - self.assertEqual( account_response.id, - account.id, - "listAccount response does not match with account Id " - ) - self.assertEqual( - account_response.user[0].firstname, - self.services["account"]["firstname"], - "listAccount response does not match with account firstname" - ) - - self.cleanup.append(account) - return - - @attr(tags=["basic", "advanced"]) - def test_createUserWithUUID(self): - """ - Test for creating User by passing id parameter - - # Validate the following - # 1.Create a User by passing id parameter.Verify the user is created. - # 2.List this user by passing id parameter.Verify that list user is able to list this user. - # 3.Delete User should succeed. - - """ - - user = User.create( - self.api_client, - self.services["user"], - account="Admin", - domainid=self.domain.id - ) - self.assertIn ( self.services["user"]["userUUID"] , user.id, - "User is not created successfully with the userId passed") - - list_user = User.list(self.api_client, - id=user.id - ) - - self.assertEqual( - isinstance(list_user, list), - True, - "Check for list user response by uuid failed" - ) - - - user_response = list_user[0] - - - self.assertEqual( user_response.id, - user.id, - "list User response does not match with user Id " - ) - self.assertEqual( - user_response.firstname, - self.services["user"]["firstname"], - "listUser response does not match with user firstname" - ) - - user.delete(self.api_client) - - list_user = User.list(self.api_client, - id=user.id - ) - - self.assertIsNone( - list_user, - "Deletion of user failed" - ) - - - return - - @attr(tags=["basic", "advanced"]) - def test_createdomainWithUUID(self): - """ - Test for creating Domain by passing id parameter - - # Validate the following - # 1.Create a domain by passing id parameter.Verify the domain is created. - # 2.List this domain by passing id parameter.Verify that list domain is able to list this domain. - # 3.Delete domain should succeed. - - """ - - domain = Domain.create( - self.api_client, - self.services["domain"] - ) - self.assertIn ( self.services["domain"]["domainUUID"] , domain.id, - "Domain is not created with the doaminId passed") - - list_domain = Domain.list(self.api_client, - id=domain.id - ) - - self.assertEqual( - isinstance(list_domain, list), - True, - "Check for list domain response by uuid failed" - ) - - - domain_response = list_domain[0] - - - self.assertEqual( domain_response.id, - domain.id, - "list domain response does not match with domain Id " - ) - self.assertIn( - self.services["domain"]["name"], - domain_response.name, - "list domaiin response does not match with user firstname" - ) - try: - domain.delete(self.api_client) - except Exception as e: - self.fail("Failed to delete domain: %s" % e) + def setUp(self): + pseudo_random_int = choice(xrange(1, 200)) + self.services["region"]["regionid"] = pseudo_random_int + self.services["region"]["regionname"] = "region" + str(pseudo_random_int) + self.services["region"]["regionendpoint"] = "http://region" + str(pseudo_random_int) + ":8080/client" - return - - @attr(tags=["basic", "advanced"]) - def test_createRegion(self): - """ - Test for add Region - """ - - region = Region.create(self.api_client, + self.region = Region.create(self.api_client, self.services["region"] - ) + ) + self.cleanup = [] + self.cleanup.append(self.region) - list_region = Region.list(self.api_client, + list_region = Region.list(self.api_client, id=self.services["region"]["regionid"] - ) - - self.assertEqual( - isinstance(list_region, list), - True, - "Check for list Region response" - ) - region_response = list_region[0] - - print (region_response) - print (self.services["region"]) - - self.assertEqual( - str(region_response.id), - self.services["region"]["regionid"], - "listRegion response does not match with region Id created" - ) + ) self.assertEqual( - region_response.name, - self.services["region"]["regionname"], - "listRegion response does not match with region name created" - ) - self.assertEqual( - region_response.endpoint, - self.services["region"]["regionendpoint"], - "listRegion response does not match with region endpoint created" - ) - - region = region.delete(self.api_client) - - return - - @attr(tags=["basic", "advanced"]) - def test_createDupRegion(self): - """ - Test for duplicate checks on id and name parameters when adding regions - """ - - self.services["region"]["regionid"]="5" - self.services["region"]["regionname"]="Region5" - self.services["region"]["regionendpoint"]="http://region5:8080/client" - - - region = Region.create(self.api_client, - self.services["region"] - ) + isinstance(list_region, list), + True, + msg="Region creation failed" + ) - list_region = Region.list(self.api_client, - id=self.services["region"]["regionid"] - ) + @attr(tags=["simulator", "basic", "advanced"]) + def test_createRegionWithExistingRegionId(self): + """Test for duplicate checks on region id + """ + self.services["region"]["regionname"] = random_gen() #alter region name but not id + self.assertRaises(Exception, Region.create, self.api_client, self.services["region"]) - self.assertEqual( - isinstance(list_region, list), - True - ) - """ - Creating regions with duplicate id should not be allowed + @attr(tags=["simulator", "basic", "advanced"]) + def test_createRegionWithExistingRegionName(self): + """Test for duplicate checks on region name """ + random_int = choice(xrange(1, 200)) + self.services["region"]["regionid"] = random_int #alter id but not name + self.services["region"]["regionendpoint"] = "http://region" + str(random_int) + ":8080/client" + self.assertRaises(Exception, Region.create, self.api_client, self.services["region"]) - self.services["region"]["regionid"]="5" - self.services["region"]["regionname"]="Region51" - self.services["region"]["regionendpoint"]="http://region51:8080/client" + @attr(tags=["simulator", "basic", "advanced"]) + def test_updateRegion(self): + """ Test for update Region + """ + self.services["region"]["regionname"] = "Region3" + random_gen() + self.services["region"]["regionendpoint"] = "http://region3updated:8080/client" - try: - region = Region.create(self.api_client, - self.services["region"] + updated_region = self.region.update(self.api_client, + self.services["region"] ) - self.assertIsNone(region, - "Creating regions with duplicate id is allowed" - ) - except: - print " Creating Region with duplicate Id is not allowed" - pass - """ - Creating regions with duplicate name should not be allowed - """ - - self.services["region"]["regionid"]="51" - self.services["region"]["regionname"]="Region5" - self.services["region"]["regionendpoint"]="http://region51:8080/client" - - try: - region = Region.create(self.api_client, - self.services["region"] + list_region = Region.list(self.api_client, + id=self.services["region"]["regionid"] ) - except: - print " Creating Region with duplicate Name is not allowed" - pass - - region.delete(self.api_client) - - return - - @attr(tags=["basic", "advanced"]) - def test_updateRegion(self): - """ - Test for update Region - """ - - self.services["region"]["regionid"]="3" - self.services["region"]["regionname"]="Region3" - self.services["region"]["regionendpoint"]="http://region3:8080/client" - region = Region.create(self.api_client, - self.services["region"] - ) - - self.services["region"]["regionname"]="Region3upd" - self.services["region"]["regionendpoint"]="http://region3upd:8080/client" - - updated_region = region.update(self.api_client, - self.services["region"] - ) - - list_region = Region.list(self.api_client, - id=self.services["region"]["regionid"] - ) - - self.assertEqual( - isinstance(list_region, list), - True, - "Check for list Region response" - ) - region_response = list_region[0] - - self.assertEqual( - str(region_response.id), - self.services["region"]["regionid"], - "listRegion response does not match with region Id created" - ) - - self.assertEqual( - region_response.name, - self.services["region"]["regionname"], - "listRegion response does not match with region name created" - ) - self.assertEqual( - region_response.endpoint, - self.services["region"]["regionendpoint"], - "listRegion response does not match with region endpoint created" - ) - - region.delete(self.api_client) - - return - - @attr(tags=["basic", "advanced"]) - def test_deleteRegion(self): - """ - Test for delete Region - """ - - self.services["region"]["regionid"]="4" - self.services["region"]["regionname"]="Region4" - self.services["region"]["regionendpoint"]="http://region4:8080/client" - - region = Region.create(self.api_client, - self.services["region"] - ) - - list_region = Region.list(self.api_client, - id=self.services["region"]["regionid"] - ) - - print (list_region); - - self.assertEqual( - len(list_region), - 1, - "Check for Region response" - ) - region = region.delete(self.api_client) - - list_region = Region.list(self.api_client, - id=self.services["region"]["regionid"] - ) - - print (list_region); - - self.assertIsNone(list_region, - "Check for empty Region response" - ) + self.assertEqual( + isinstance(list_region, list), + True, + "Check for list Region response" + ) + region_response = list_region[0] - return + self.assertEqual( + region_response.id, + updated_region.id, + "listRegion response does not match with region Id created" + ) + self.assertEqual( + region_response.name, + updated_region.name, + "listRegion response does not match with region name created" + ) + self.assertEqual( + region_response.endpoint, + updated_region.endpoint, + "listRegion response does not match with region endpoint created" + ) - @classmethod - def tearDown(cls): + def tearDown(self): + """ Test for delete region as cleanup + """ + try: + #Clean up + cleanup_resources(self.api_client, self.cleanup) + except Exception as e: + raise Exception("Warning: Exception during cleanup : %s" % e) - try: - cls.api_client = super(TestRegions, cls).getClsTestClient().getApiClient() - #Clean up - cleanup_resources(cls.api_client, cls.cleanup) - except Exception as e: - raise Exception("Warning: Exception during cleanup : %s" % e) + @classmethod + def tearDownClass(cls): + """ + Nothing to do + """ + pass http://git-wip-us.apache.org/repos/asf/cloudstack/blob/548a8d8c/test/integration/component/test_regions_accounts.py ---------------------------------------------------------------------- diff --git a/test/integration/component/test_regions_accounts.py b/test/integration/component/test_regions_accounts.py new file mode 100644 index 0000000..113f725 --- /dev/null +++ b/test/integration/component/test_regions_accounts.py @@ -0,0 +1,206 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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 marvin.cloudstackTestCase import * +from marvin.cloudstackAPI import * +from marvin.integration.lib.utils import * +from marvin.integration.lib.base import * +from marvin.integration.lib.common import * +from nose.plugins.attrib import attr + +class Services: + def __init__(self): + self.services = { + "domain": { + "name": "testuuid", + "domainUUID": "domain1" + }, + "account": { + "email": "t...@test.com", + "firstname": "Testuuid", + "lastname": "Useruuid", + "username": "test", + "password": "password", + "accountUUID": "account1", + "userUUID": "user1" + }, + "user": { + "email": "t...@test.com", + "firstname": "Testuuid", + "lastname": "Useruuid", + "username": "test", + "password": "password", + "userUUID": "user2" + }, + } + + +class TestRegionsAccounts(cloudstackTestCase): + """Test Accounts in Regions - CRUD tests for accounts in regions + """ + + @classmethod + def setUpClass(cls): + cls.api_client = super(TestRegionsAccounts, cls).getClsTestClient().getApiClient() + cls.services = Services().services + cls.domain = get_domain(cls.api_client, cls.services) + cls.cleanup = [] + return + + @attr(tags=["simulator", "basic", "advanced"]) + def test_createAccountWithUUID(self): + """Test for creating account by passing id parameter + + # Validate the following + # 1.Create an Account by passing id parameter.Verify the account is created. + # 2.List this account by passing id parameter.Verify that list account is able to lis this account. + # 3.Delete account should succeed. + """ + account = Account.create( + self.api_client, + self.services["account"], + domainid=self.domain.id + ) + self.assertIn(self.services["account"]["accountUUID"], account.id, + "Account is not created with the accountId passed") + + list_account = Account.list(self.api_client, + id=account.id) + + self.assertEqual( + isinstance(list_account, list), + True, + "Check for list account response by uuid failed" + ) + + account_response = list_account[0] + self.assertEqual(account_response.id, + account.id, + "listAccount response does not match with account Id " + ) + self.assertEqual( + account_response.user[0].firstname, + self.services["account"]["firstname"], + "listAccount response does not match with account firstname" + ) + + self.cleanup.append(account) + return + + @attr(tags=["simulator", "basic", "advanced"]) + def test_createUserWithUUID(self): + """Test for creating User by passing id parameter + + # Validate the following + # 1.Create a User by passing id parameter.Verify the user is created. + # 2.List this user by passing id parameter.Verify that list user is able to list this user. + # 3.Delete User should succeed. + """ + + user = User.create( + self.api_client, + self.services["user"], + account="admin", + domainid=self.domain.id + ) + self.assertIn(self.services["user"]["userUUID"], user.id, + "User is not created successfully with the userId passed") + + list_user = User.list(self.api_client, id=user.id) + + self.assertEqual( + isinstance(list_user, list), + True, + "Check for list user response by uuid failed" + ) + + user_response = list_user[0] + + self.assertEqual(user_response.id, + user.id, + "list User response does not match with user Id " + ) + self.assertEqual( + user_response.firstname, + self.services["user"]["firstname"], + "listUser response does not match with user firstname" + ) + + user.delete(self.api_client) + + list_user = User.list(self.api_client, + id=user.id + ) + + self.assertIsNone( + list_user, + "Deletion of user failed" + ) + return + + @attr(tags=["simulator", "basic", "advanced"]) + def test_createdomainWithUUID(self): + """Test for creating Domain by passing id parameter + + # Validate the following + # 1.Create a domain by passing id parameter.Verify the domain is created. + # 2.List this domain by passing id parameter.Verify that list domain is able to list this domain. + # 3.Delete domain should succeed. + """ + + domain = Domain.create( + self.api_client, + self.services["domain"] + ) + + self.assertIn(self.services["domain"]["domainUUID"], domain.id, + "Domain is not created with the doaminId passed") + + list_domain = Domain.list(self.api_client, + id=domain.id + ) + + self.assertEqual( + isinstance(list_domain, list), + True, + "Check for list domain response by uuid failed" + ) + + domain_response = list_domain[0] + + self.assertEqual(domain_response.id, + domain.id, + "list domain response does not match with domain Id " + ) + self.assertIn( + self.services["domain"]["name"], + domain_response.name, + "list domaiin response does not match with user firstname" + ) + try: + domain.delete(self.api_client) + except Exception as e: + self.fail("Failed to delete domain: %s" % e) + return + + @classmethod + def tearDownClass(cls): + try: + #Clean up + cleanup_resources(cls.api_client, cls.cleanup) + except Exception as e: + raise Exception("Warning: Exception during cleanup : %s" % e) \ No newline at end of file http://git-wip-us.apache.org/repos/asf/cloudstack/blob/548a8d8c/test/integration/smoke/test_regions.py ---------------------------------------------------------------------- diff --git a/test/integration/smoke/test_regions.py b/test/integration/smoke/test_regions.py new file mode 100644 index 0000000..5d12e74 --- /dev/null +++ b/test/integration/smoke/test_regions.py @@ -0,0 +1,93 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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 marvin.cloudstackTestCase import * +from marvin.cloudstackAPI import * +from marvin.integration.lib.utils import * +from marvin.integration.lib.base import * +from marvin.integration.lib.common import * +from nose.plugins.attrib import attr + +class Services: + def __init__(self): + self.services = { + "region": { + "regionid": "2", + "regionname": "Region2", + "regionendpoint": "http://region2:8080/client" + } + } + + +class TestRegions(cloudstackTestCase): + """Test Regions - basic region creation + """ + + @classmethod + def setUpClass(cls): + cls.api_client = super(TestRegions, cls).getClsTestClient().getApiClient() + cls.services = Services().services + cls.domain = get_domain(cls.api_client, cls.services) + cls.cleanup = [] + + @attr(tags=["simulator", "basic", "advanced"]) + def test_createRegion(self): + """ Test for create region + """ + region = Region.create(self.api_client, + self.services["region"] + ) + + list_region = Region.list(self.api_client, + id=self.services["region"]["regionid"] + ) + + self.assertEqual( + isinstance(list_region, list), + True, + "Check for list Region response" + ) + region_response = list_region[0] + + self.assertEqual( + str(region_response.id), + self.services["region"]["regionid"], + "listRegion response does not match with region Id created" + ) + + self.assertEqual( + region_response.name, + self.services["region"]["regionname"], + "listRegion response does not match with region name created" + ) + self.assertEqual( + region_response.endpoint, + self.services["region"]["regionendpoint"], + "listRegion response does not match with region endpoint created" + ) + self.cleanup.append(region) + return + + @classmethod + def tearDownClass(cls): + try: + #Clean up + cleanup_resources(cls.api_client, cls.cleanup) + list_region = Region.list(cls.api_client, id=cls.services["region"]["regionid"]) + assert list_region is None, "Region deletion fails" + except Exception as e: + raise Exception("Warning: Region cleanup/delete fails with : %s" % e) \ No newline at end of file http://git-wip-us.apache.org/repos/asf/cloudstack/blob/548a8d8c/tools/marvin/marvin/integration/lib/base.py ---------------------------------------------------------------------- diff --git a/tools/marvin/marvin/integration/lib/base.py b/tools/marvin/marvin/integration/lib/base.py index 899c203..ecdc841 100755 --- a/tools/marvin/marvin/integration/lib/base.py +++ b/tools/marvin/marvin/integration/lib/base.py @@ -40,8 +40,8 @@ class Domain: cmd = createDomain.createDomainCmd() - if "domainUUID" in services: - cmd.domainid = "-".join([services["domainUUID"],random_gen()]) + if "domainUUID" in services: + cmd.domainid = "-".join([services["domainUUID"], random_gen()]) if name: cmd.name = "-".join([name, random_gen()]) @@ -3151,9 +3151,9 @@ class Region: cmd = updateRegion.updateRegionCmd() cmd.id = self.id if services["regionendpoint"]: - cmd.endpoint = services["regionendpoint"] + cmd.endpoint = services["regionendpoint"] if services["regionname"]: - cmd.name = services["regionname"] + cmd.name = services["regionname"] region = apiclient.updateRegion(cmd) return region