CLOUDSTACK-2329, CLOUDSTACK-1820: Tests for regions

Marvin tests and corresponding library changes for the regions feature.

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/5ef2f1f2
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/5ef2f1f2
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/5ef2f1f2

Branch: refs/heads/object_store
Commit: 5ef2f1f26fcd159cb48b25882ea10cb3fc44d1b9
Parents: b6cb23c
Author: Sangeetha Hariharan <sangeetha.hariha...@citrix.com>
Authored: Fri May 3 17:02:32 2013 -0700
Committer: Prasanna Santhanam <t...@apache.org>
Committed: Wed May 8 13:49:13 2013 +0530

----------------------------------------------------------------------
 test/integration/component/test_regions.py  |  443 ++++++++++++++++++++++
 tools/marvin/marvin/integration/lib/base.py |   54 +++
 2 files changed, 497 insertions(+), 0 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5ef2f1f2/test/integration/component/test_regions.py
----------------------------------------------------------------------
diff --git a/test/integration/component/test_regions.py 
b/test/integration/component/test_regions.py
new file mode 100644
index 0000000..1b24871
--- /dev/null
+++ b/test/integration/component/test_regions.py
@@ -0,0 +1,443 @@
+#!/usr/bin/env python
+# 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 marvin import remoteSSHClient
+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",
+                # 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";
+       }
+        }
+
+
+class TestRegions(cloudstackTestCase):
+    """
+   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 = []
+        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)
+
+   return
+
+    @attr(tags=["basic", "advanced"])
+    def test_createRegion(self):
+   """
+       Test for add 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]
+
+   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"]
+   )
+
+   list_region = Region.list(self.api_client,
+            id=self.services["region"]["regionid"]
+   )
+
+   self.assertEqual(
+                         isinstance(list_region, list),
+                         True
+           )
+   """
+        Creating regions with duplicate id should not be allowed
+        """
+
+   self.services["region"]["regionid"]="5"
+        self.services["region"]["regionname"]="Region51"
+        self.services["region"]["regionendpoint"]="http://region51:8080/client";
+
+   try:
+       region = Region.create(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"]
+       )
+   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"
+                         )
+
+   return
+
+
+        @classmethod
+        def tearDown(cls):
+
+            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)

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5ef2f1f2/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 92b8a2d..899c203 100755
--- a/tools/marvin/marvin/integration/lib/base.py
+++ b/tools/marvin/marvin/integration/lib/base.py
@@ -40,6 +40,9 @@ class Domain:
 
         cmd = createDomain.createDomainCmd()
 
+   if "domainUUID" in services:
+            cmd.domainid = "-".join([services["domainUUID"],random_gen()])
+
         if name:
             cmd.name = "-".join([name, random_gen()])
         elif "name" in services:
@@ -97,6 +100,13 @@ class Account:
         cmd.password = services["password"]
         cmd.username = "-".join([services["username"], random_gen()])
 
+        if "accountUUID" in services:
+            cmd.accountid =  "-".join([services["accountUUID"],random_gen()])
+
+        if "userUUID" in services:
+            cmd.userid = "-".join([services["userUUID"],random_gen()])
+
+
         if domainid:
             cmd.domainid = domainid
         account = apiclient.createAccount(cmd)
@@ -135,6 +145,9 @@ class User:
         cmd.firstname = services["firstname"]
         cmd.lastname = services["lastname"]
 
+        if "userUUID" in services:
+            cmd.userid = "-".join([services["userUUID"],random_gen()])
+
         # Password Encoding
         mdf = hashlib.md5()
         mdf.update(services["password"])
@@ -3108,3 +3121,44 @@ class VmSnapshot:
         cmd.vmsnapshotid = vmsnapshotid
         
         return apiclient.deleteVMSnapshot(cmd)
+
+class Region:
+    """ Regions related Api """
+    def __init__(self, items):
+        self.__dict__.update(items)
+
+    @classmethod
+    def create(cls, apiclient, services):
+        cmd = addRegion.addRegionCmd()
+        cmd.id = services["regionid"]
+        cmd.endpoint = services["regionendpoint"]
+        cmd.name = services["regionname"]
+        try:
+            region = apiclient.addRegion(cmd)
+            if region is not None:
+                return Region(region.__dict__)
+        except Exception as e:
+            raise e
+
+    @classmethod
+    def list(cls, apiclient, **kwargs):
+        cmd = listRegions.listRegionsCmd()
+        [setattr(cmd, k, v) for k, v in kwargs.items()]
+        region = apiclient.listRegions(cmd)
+        return region
+
+    def update(self, apiclient, services):
+        cmd = updateRegion.updateRegionCmd()
+        cmd.id = self.id
+        if services["regionendpoint"]:
+                cmd.endpoint = services["regionendpoint"]
+        if services["regionname"]:
+                cmd.name = services["regionname"]
+        region = apiclient.updateRegion(cmd)
+        return region
+
+    def delete(self, apiclient):
+        cmd = removeRegion.removeRegionCmd()
+        cmd.id = self.id
+        region = apiclient.removeRegion(cmd)
+        return region

Reply via email to