diff --git a/setup/dev/advanced.cfg b/setup/dev/advanced.cfg index 199571d335b..15d10572b8b 100644 --- a/setup/dev/advanced.cfg +++ b/setup/dev/advanced.cfg @@ -226,6 +226,6 @@ }, "TestData": { - "Path": "" + "Path": "config/config.cfg" } } diff --git a/test/integration/smoke/test_deploy_vm.py b/test/integration/smoke/test_deploy_vm.py index 9f40f78ad0a..9b28186af29 100644 --- a/test/integration/smoke/test_deploy_vm.py +++ b/test/integration/smoke/test_deploy_vm.py @@ -44,7 +44,7 @@ class TestDeployVM(cloudstackTestCase): # Get Zone, Domain and Default Built-in template self.domain = get_domain(self.apiclient) - self.zone = get_zone(self.apiclient, self.testClient.getZoneForTests()) + self.zone = get_zone(self.apiclient, self.testdata) self.testdata["mode"] = self.zone.networktype self.template = get_template(self.apiclient, self.zone.id, self.testdata["ostype"]) diff --git a/test/integration/smoke/test_deploy_vm_with_userdata.py b/test/integration/smoke/test_deploy_vm_with_userdata.py index eb03194db3a..27dce50f17e 100644 --- a/test/integration/smoke/test_deploy_vm_with_userdata.py +++ b/test/integration/smoke/test_deploy_vm_with_userdata.py @@ -36,7 +36,7 @@ class TestDeployVmWithUserData(cloudstackTestCase): cls.apiClient = testClient.getApiClient() cls.services = testClient.getParsedTestDataConfig() - cls.zone = get_zone(cls.apiClient, testClient.getZoneForTests()) + cls.zone = get_zone(cls.apiClient, cls.getZoneForTests()) if cls.zone.localstorageenabled: #For devcloud since localstroage is enabled cls.services["service_offerings"]["storagetype"] = "local" diff --git a/test/integration/smoke/test_deploy_vms_with_varied_deploymentplanners.py b/test/integration/smoke/test_deploy_vms_with_varied_deploymentplanners.py index c0c77e78bef..270d9d2997d 100644 --- a/test/integration/smoke/test_deploy_vms_with_varied_deploymentplanners.py +++ b/test/integration/smoke/test_deploy_vms_with_varied_deploymentplanners.py @@ -34,7 +34,7 @@ class TestDeployVmWithVariedPlanners(cloudstackTestCase): # Get Zone, Domain and templates cls.domain = get_domain(cls.apiclient) - cls.zone = get_zone(cls.apiclient, testClient.getZoneForTests()) + cls.zone = get_zone(cls.apiclient, cls.getZoneForTests()) cls.template = get_template( cls.apiclient, cls.zone.id, diff --git a/test/integration/smoke/test_guest_vlan_range.py b/test/integration/smoke/test_guest_vlan_range.py index ecf7a0d0727..886d1b87dce 100644 --- a/test/integration/smoke/test_guest_vlan_range.py +++ b/test/integration/smoke/test_guest_vlan_range.py @@ -36,7 +36,7 @@ class TestDedicateGuestVlanRange(cloudstackTestCase): # Get Zone, Domain cls.domain = get_domain(cls.apiclient) - cls.zone = get_zone(cls.apiclient, testClient.getZoneForTests()) + cls.zone = get_zone(cls.apiclient, cls.getZoneForTests()) # Create Account cls.account = Account.create( diff --git a/test/integration/smoke/test_hosts.py b/test/integration/smoke/test_hosts.py index 31af7fca6e7..57c35f57afc 100644 --- a/test/integration/smoke/test_hosts.py +++ b/test/integration/smoke/test_hosts.py @@ -37,7 +37,7 @@ class TestHosts(cloudstackTestCase): self.apiclient = self.testClient.getApiClient() self.dbclient = self.testClient.getDbConnection() self.services = self.testClient.getParsedTestDataConfig() - self.zone = get_zone(self.apiclient, self.testClient.getZoneForTests()) + self.zone = get_zone(self.apiclient, self.getZoneForTests()) self.pod = get_pod(self.apiclient, self.zone.id) self.cleanup = [] diff --git a/test/integration/smoke/test_internal_lb.py b/test/integration/smoke/test_internal_lb.py index 8a64b4dc12c..5a9127b83b7 100644 --- a/test/integration/smoke/test_internal_lb.py +++ b/test/integration/smoke/test_internal_lb.py @@ -34,7 +34,7 @@ class TestInternalLb(cloudstackTestCase): cls.apiclient = testClient.getApiClient() cls.services = testClient.getParsedTestDataConfig() - cls.zone = get_zone(cls.apiclient, testClient.getZoneForTests()) + cls.zone = get_zone(cls.apiclient, cls.getZoneForTests()) cls.domain = get_domain(cls.apiclient) cls.service_offering = ServiceOffering.create( cls.apiclient, diff --git a/test/integration/smoke/test_iso.py b/test/integration/smoke/test_iso.py index 72dc70d97fc..0aec94c9f3f 100644 --- a/test/integration/smoke/test_iso.py +++ b/test/integration/smoke/test_iso.py @@ -39,7 +39,7 @@ class TestCreateIso(cloudstackTestCase): self.dbclient = self.testClient.getDbConnection() # Get Zone, Domain and templates self.domain = get_domain(self.apiclient) - self.zone = get_zone(self.apiclient, self.testClient.getZoneForTests()) + self.zone = get_zone(self.apiclient, self.getZoneForTests()) self.services['mode'] = self.zone.networktype self.services["domainid"] = self.domain.id self.services["iso_2"]["zoneid"] = self.zone.id diff --git a/test/integration/smoke/test_loadbalance.py b/test/integration/smoke/test_loadbalance.py index 28a14e4420f..c9fe2e043f9 100644 --- a/test/integration/smoke/test_loadbalance.py +++ b/test/integration/smoke/test_loadbalance.py @@ -38,7 +38,7 @@ class TestLoadBalance(cloudstackTestCase): # Get Zone, Domain and templates cls.domain = get_domain(cls.apiclient) - cls.zone = get_zone(cls.apiclient, testClient.getZoneForTests()) + cls.zone = get_zone(cls.apiclient, cls.getZoneForTests()) template = get_template( cls.apiclient, cls.zone.id, diff --git a/test/integration/smoke/test_multipleips_per_nic.py b/test/integration/smoke/test_multipleips_per_nic.py index 9c7f2f75a38..8acf28534f1 100644 --- a/test/integration/smoke/test_multipleips_per_nic.py +++ b/test/integration/smoke/test_multipleips_per_nic.py @@ -48,7 +48,7 @@ class TestDeployVM(cloudstackTestCase): # Get Zone, Domain and Default Built-in template self.domain = get_domain(self.apiclient) - self.zone = get_zone(self.apiclient, self.testClient.getZoneForTests()) + self.zone = get_zone(self.apiclient, self.getZoneForTests()) self.testdata["mode"] = self.zone.networktype self.template = get_template(self.apiclient, self.zone.id, self.testdata["ostype"]) diff --git a/test/integration/smoke/test_network.py b/test/integration/smoke/test_network.py index 258d2546cd2..566bd37337e 100644 --- a/test/integration/smoke/test_network.py +++ b/test/integration/smoke/test_network.py @@ -46,7 +46,7 @@ class TestPublicIP(cloudstackTestCase): # Get Zone, Domain and templates cls.domain = get_domain(cls.apiclient) - cls.zone = get_zone(cls.apiclient, testClient.getZoneForTests()) + cls.zone = get_zone(cls.apiclient, cls.getZoneForTests()) cls.services['mode'] = cls.zone.networktype # Create Accounts & networks cls.account = Account.create( @@ -541,7 +541,7 @@ class TestRebootRouter(cloudstackTestCase): # Get Zone, Domain and templates self.domain = get_domain(self.apiclient) - self.zone = get_zone(self.apiclient, self.testClient.getZoneForTests()) + self.zone = get_zone(self.apiclient, self.getZoneForTests()) template = get_template( self.apiclient, self.zone.id, diff --git a/test/integration/smoke/test_network_acl.py b/test/integration/smoke/test_network_acl.py index 1133bee0af1..50bbbf3be00 100644 --- a/test/integration/smoke/test_network_acl.py +++ b/test/integration/smoke/test_network_acl.py @@ -32,7 +32,7 @@ class TestNetworkACL(cloudstackTestCase): cls.apiclient = testClient.getApiClient() cls.services = testClient.getParsedTestDataConfig() - cls.zone = get_zone(cls.apiclient, testClient.getZoneForTests()) + cls.zone = get_zone(cls.apiclient, cls.getZoneForTests()) cls.domain = get_domain(cls.apiclient) cls.service_offering = ServiceOffering.create( cls.apiclient, diff --git a/test/integration/smoke/test_nic.py b/test/integration/smoke/test_nic.py index 0e866b8b7b3..4ee43b5e8f9 100644 --- a/test/integration/smoke/test_nic.py +++ b/test/integration/smoke/test_nic.py @@ -48,7 +48,7 @@ class TestNic(cloudstackTestCase): # Get Zone, Domain and templates domain = get_domain(self.apiclient) - zone = get_zone(self.apiclient, self.testClient.getZoneForTests()) + zone = get_zone(self.apiclient, self.getZoneForTests()) self.services['mode'] = zone.networktype if zone.networktype != 'Advanced': diff --git a/test/integration/smoke/test_portable_publicip.py b/test/integration/smoke/test_portable_publicip.py index 48310a5cbf4..37aaada6e9b 100644 --- a/test/integration/smoke/test_portable_publicip.py +++ b/test/integration/smoke/test_portable_publicip.py @@ -39,7 +39,7 @@ class TestPortablePublicIPRange(cloudstackTestCase): # Get Zone, Domain cls.domain = get_domain(cls.apiclient) - cls.zone = get_zone(cls.apiclient, cls.testClient.getZoneForTests()) + cls.zone = get_zone(cls.apiclient, cls.getZoneForTests()) # Create Account cls.account = Account.create( diff --git a/test/integration/smoke/test_primary_storage.py b/test/integration/smoke/test_primary_storage.py index 8f89f4f8972..9437b3d8b01 100644 --- a/test/integration/smoke/test_primary_storage.py +++ b/test/integration/smoke/test_primary_storage.py @@ -37,7 +37,7 @@ class TestPrimaryStorageServices(cloudstackTestCase): self.services = self.testClient.getParsedTestDataConfig() self.cleanup = [] # Get Zone and pod - self.zone = get_zone(self.apiclient, self.testClient.getZoneForTests()) + self.zone = get_zone(self.apiclient, self.getZoneForTests()) self.pod = get_pod(self.apiclient, self.zone.id) return diff --git a/test/integration/smoke/test_public_ip_range.py b/test/integration/smoke/test_public_ip_range.py index ae9b64bf87f..998bda25331 100644 --- a/test/integration/smoke/test_public_ip_range.py +++ b/test/integration/smoke/test_public_ip_range.py @@ -34,7 +34,7 @@ class TestDedicatePublicIPRange(cloudstackTestCase): cls.services = Services().services # Get Zone, Domain cls.domain = get_domain(cls.apiclient) - cls.zone = get_zone(cls.apiclient, cls.getClsTestClient.getZoneForTests()) + cls.zone = get_zone(cls.apiclient, cls.getZoneForTests()) # Create Account cls.account = Account.create( diff --git a/test/integration/smoke/test_reset_vm_on_reboot.py b/test/integration/smoke/test_reset_vm_on_reboot.py index 253f0f4aaf9..fac96fa2557 100644 --- a/test/integration/smoke/test_reset_vm_on_reboot.py +++ b/test/integration/smoke/test_reset_vm_on_reboot.py @@ -36,7 +36,7 @@ class TestResetVmOnReboot(cloudstackTestCase): # Get Zone, Domain and templates domain = get_domain(cls.apiclient) - zone = get_zone(cls.apiclient, testClient.getZoneForTests()) + zone = get_zone(cls.apiclient, cls.getZoneForTests()) cls.services['mode'] = zone.networktype template = get_template( diff --git a/test/integration/smoke/test_resource_detail.py b/test/integration/smoke/test_resource_detail.py index 1613a4ade3e..e7081f75e52 100644 --- a/test/integration/smoke/test_resource_detail.py +++ b/test/integration/smoke/test_resource_detail.py @@ -40,7 +40,7 @@ class TestResourceDetail(cloudstackTestCase): # Get Zone, Domain and templates domain = get_domain(cls.apiclient) - zone = get_zone(cls.apiclient, testClient.getZoneForTests()) + zone = get_zone(cls.apiclient, cls.getZoneForTests()) cls.services['mode'] = zone.networktype # Set Zones and disk offerings ?? diff --git a/test/integration/smoke/test_routers.py b/test/integration/smoke/test_routers.py index 0c91b9f1c29..61dc5be8a6f 100644 --- a/test/integration/smoke/test_routers.py +++ b/test/integration/smoke/test_routers.py @@ -42,7 +42,7 @@ class TestRouterServices(cloudstackTestCase): # Get Zone, Domain and templates cls.domain = get_domain(cls.apiclient) - cls.zone = get_zone(cls.apiclient, testClient.getZoneForTests()) + cls.zone = get_zone(cls.apiclient, cls.getZoneForTests()) cls.services['mode'] = cls.zone.networktype template = get_template( cls.apiclient, diff --git a/test/integration/smoke/test_scale_vm.py b/test/integration/smoke/test_scale_vm.py index 5ab4463e312..6fa8d7750f0 100644 --- a/test/integration/smoke/test_scale_vm.py +++ b/test/integration/smoke/test_scale_vm.py @@ -36,7 +36,7 @@ class TestScaleVm(cloudstackTestCase): # Get Zone, Domain and templates domain = get_domain(cls.apiclient) - zone = get_zone(cls.apiclient, testClient.getZoneForTests()) + zone = get_zone(cls.apiclient, cls.getZoneForTests()) cls.services['mode'] = zone.networktype template = get_template( diff --git a/test/integration/smoke/test_service_offerings.py b/test/integration/smoke/test_service_offerings.py index 0c7752d1bbd..b518c98d53b 100644 --- a/test/integration/smoke/test_service_offerings.py +++ b/test/integration/smoke/test_service_offerings.py @@ -137,7 +137,7 @@ class TestServiceOfferings(cloudstackTestCase): cls.services = testClient.getParsedTestDataConfig() domain = get_domain(cls.apiclient) - cls.zone = get_zone(cls.apiclient, testClient.getZoneForTests()) + cls.zone = get_zone(cls.apiclient, cls.getZoneForTests()) cls.services['mode'] = cls.zone.networktype cls.service_offering_1 = ServiceOffering.create( diff --git a/test/integration/smoke/test_snapshots.py b/test/integration/smoke/test_snapshots.py index d475d87059c..312da458ee4 100644 --- a/test/integration/smoke/test_snapshots.py +++ b/test/integration/smoke/test_snapshots.py @@ -32,7 +32,7 @@ class TestSnapshotRootDisk(cloudstackTestCase): # Get Zone, Domain and templates cls.domain = get_domain(cls.apiclient) - cls.zone = get_zone(cls.apiclient, testClient.getZoneForTests()) + cls.zone = get_zone(cls.apiclient, cls.getZoneForTests()) cls.services['mode'] = cls.zone.networktype template = get_template( diff --git a/test/integration/smoke/test_ssvm.py b/test/integration/smoke/test_ssvm.py index 3ba73033243..d8e9f8562c9 100644 --- a/test/integration/smoke/test_ssvm.py +++ b/test/integration/smoke/test_ssvm.py @@ -38,7 +38,7 @@ class TestSSVMs(cloudstackTestCase): self.apiclient = self.testClient.getApiClient() self.cleanup = [] self.services = Services().services - self.zone = get_zone(self.apiclient, self.testClient.getZoneForTests()) + self.zone = get_zone(self.apiclient, self.getZoneForTests()) return def tearDown(self): diff --git a/test/integration/smoke/test_templates.py b/test/integration/smoke/test_templates.py index 26bbb5504d1..71aee48ab9a 100644 --- a/test/integration/smoke/test_templates.py +++ b/test/integration/smoke/test_templates.py @@ -59,7 +59,7 @@ class TestCreateTemplate(cloudstackTestCase): # Get Zone, Domain and templates cls.domain = get_domain(cls.apiclient) - cls.zone = get_zone(cls.apiclient, testClient.getZoneForTests()) + cls.zone = get_zone(cls.apiclient, cls.getZoneForTests()) cls.services['mode'] = cls.zone.networktype cls.disk_offering = DiskOffering.create( cls.apiclient, diff --git a/test/integration/smoke/test_vm_life_cycle.py b/test/integration/smoke/test_vm_life_cycle.py index 05ecba5a7f0..31031c892b0 100644 --- a/test/integration/smoke/test_vm_life_cycle.py +++ b/test/integration/smoke/test_vm_life_cycle.py @@ -39,7 +39,7 @@ class TestDeployVM(cloudstackTestCase): # Get Zone, Domain and templates domain = get_domain(cls.apiclient) - cls.zone = get_zone(cls.apiclient, testClient.getZoneForTests()) + cls.zone = get_zone(cls.apiclient, cls.getZoneForTests()) cls.services['mode'] = cls.zone.networktype #If local storage is enabled, alter the offerings to use localstorage diff --git a/test/integration/smoke/test_vm_snapshots.py b/test/integration/smoke/test_vm_snapshots.py index 6f64802701f..86af0138c90 100644 --- a/test/integration/smoke/test_vm_snapshots.py +++ b/test/integration/smoke/test_vm_snapshots.py @@ -32,7 +32,7 @@ class TestVmSnapshot(cloudstackTestCase): cls.services = Services().services # Get Zone, Domain and templates cls.domain = get_domain(cls.apiclient) - cls.zone = get_zone(cls.apiclient, cls.getClsTestClient().getZoneForTests()) + cls.zone = get_zone(cls.apiclient, cls.getZoneForTests()) template = get_template( cls.apiclient, diff --git a/test/integration/smoke/test_volumes.py b/test/integration/smoke/test_volumes.py index 67b986f1a03..f650dd56766 100644 --- a/test/integration/smoke/test_volumes.py +++ b/test/integration/smoke/test_volumes.py @@ -43,10 +43,10 @@ class TestCreateVolume(cloudstackTestCase): testClient = super(TestCreateVolume, cls).getClsTestClient() cls.apiclient = testClient.getApiClient() cls.services = testClient.getParsedTestDataConfig() - print "\n***************",testClient.getParsedTestDataConfig() + # Get Zone, Domain and templates cls.domain = get_domain(cls.apiclient) - cls.zone = get_zone(cls.apiclient, testClient.getZoneForTests()) + cls.zone = get_zone(cls.apiclient, cls.getZoneForTests()) cls.services['mode'] = cls.zone.networktype cls.disk_offering = DiskOffering.create( cls.apiclient, @@ -224,7 +224,7 @@ class TestVolumes(cloudstackTestCase): # Get Zone, Domain and templates cls.domain = get_domain(cls.apiclient) - cls.zone = get_zone(cls.apiclient, testClient.getZoneForTests()) + cls.zone = get_zone(cls.apiclient, cls.getZoneForTests()) cls.services['mode'] = cls.zone.networktype cls.disk_offering = DiskOffering.create( cls.apiclient, diff --git a/test/integration/smoke/test_vpc_vpn.py b/test/integration/smoke/test_vpc_vpn.py index 4ec2da11dae..56215c15dca 100644 --- a/test/integration/smoke/test_vpc_vpn.py +++ b/test/integration/smoke/test_vpc_vpn.py @@ -34,7 +34,7 @@ class TestVpcRemoteAccessVpn(cloudstackTestCase): cls.apiclient = testClient.getApiClient() cls.services = testClient.getParsedTestDataConfig() - cls.zone = get_zone(cls.apiclient, testClient.getZoneForTests()) + cls.zone = get_zone(cls.apiclient, cls.getZoneForTests()) cls.domain = get_domain(cls.apiclient) cls.service_offering = ServiceOffering.create( cls.apiclient, diff --git a/tools/marvin/marvin/asyncJobMgr.py b/tools/marvin/marvin/asyncJobMgr.py index ee3ae5ad3d5..dab85ca39a7 100644 --- a/tools/marvin/marvin/asyncJobMgr.py +++ b/tools/marvin/marvin/asyncJobMgr.py @@ -16,7 +16,7 @@ # under the License. import threading -from marvin import cloudstackException +import cloudstackException import time import Queue import copy diff --git a/tools/marvin/marvin/cloudstackConnection.py b/tools/marvin/marvin/cloudstackConnection.py index ee1ff00a907..b8d9a381129 100644 --- a/tools/marvin/marvin/cloudstackConnection.py +++ b/tools/marvin/marvin/cloudstackConnection.py @@ -38,7 +38,7 @@ from requests import ( Timeout, RequestException ) -from marvin.cloudstackException import GetDetailExceptionInfo +from cloudstackException import GetDetailExceptionInfo class CSConnection(object): diff --git a/tools/marvin/marvin/cloudstackTestClient.py b/tools/marvin/marvin/cloudstackTestClient.py index a1b8e19648a..e8c6ab24952 100644 --- a/tools/marvin/marvin/cloudstackTestClient.py +++ b/tools/marvin/marvin/cloudstackTestClient.py @@ -26,25 +26,26 @@ from codes import (FAILED, PASS, ADMIN, DOMAIN_ADMIN, USER, SUCCESS, XEN_SERVER) from configGenerator import ConfigManager from marvin.lib import utils -from marvin.cloudstackException import GetDetailExceptionInfo +from cloudstackException import GetDetailExceptionInfo from marvin.lib.utils import (random_gen, validateList) from marvin.cloudstackAPI.cloudstackAPIClient import CloudStackAPIClient -class CSTestClient(object): - ''' - @Desc : CloudStackTestClient is encapsulated entity for creating and +''' +@Desc : CloudStackTestClient is encapsulated entity for creating and getting various clients viz., apiclient, user api client, dbconnection, test Data parsed information etc - @Input : - mgmt_details : Management Server Details - dbsvr_details: Database Server details of Management \ +@Input : mgmtDetails : Management Server Details + dbSvrDetails: Database Server details of Management \ Server. Retrieved from configuration file. - async_timeout : Timeout for Async queries - default_worker_threads : Number of worker threads + asyncTimeout : Timeout for Async queries + defaultWorkerThreads : Number of worker threads logger : provides logging facilities for this library zone : The zone on which test suites using this test client will run - ''' +''' + + +class CSTestClient(object): def __init__(self, mgmt_details, dbsvr_details, async_timeout=3600, @@ -132,9 +133,9 @@ class CSTestClient(object): list_user = listUsers.listUsersCmd() list_user.account = "admin" list_user_res = self.__apiClient.listUsers(list_user) - if list_user_res == FAILED or list_user_res is None or\ + if list_user_res is None or\ (validateList(list_user_res)[0] != PASS): - self.__logger.error("__createApiClient: API " + self.__logger.debug("__createApiClient: API " "Client Creation Failed") return FAILED @@ -199,6 +200,7 @@ class CSTestClient(object): register_user.id = userid register_user_res = \ self.__apiClient.registerUserKeys(register_user) + if register_user_res == FAILED: return FAILED return (register_user_res.apikey, register_user_res.secretkey) @@ -230,11 +232,9 @@ class CSTestClient(object): configuration file. They can overwrite it with providing their own configuration file as well. ''' - print "******************PATH*****************",self.__testDataFilePath self.__configObj = ConfigManager(self.__testDataFilePath) - if self.__configObj: + if self.__configObj is not None: self.__parsedTestDataConfig = self.__configObj.getConfig() - print "\n**************************************HTTTTTT***",self.__parsedTestDataConfig else: self.__logger.error("createTestClient : Not able to create " "ConfigManager Object") @@ -246,12 +246,7 @@ class CSTestClient(object): ''' 3. Creates API Client ''' - ret = self.__createApiClient() - if ret == FAILED: - self.__logger.error("********Test Client Creation Failed********") - else: - self.__logger.debug("********Test Client Creation Successful********") - return ret + return self.__createApiClient() except Exception, e: self.__logger.exception("Exception Occurred " "Under createTestClient " @@ -373,7 +368,7 @@ class CSTestClient(object): return self.__configObj def getApiClient(self): - if self.__apiClient: + if self.__apiClient is not None: self.__apiClient.id = self.identifier return self.__apiClient return None diff --git a/tools/marvin/marvin/configGenerator.py b/tools/marvin/marvin/configGenerator.py index f55b0b4cde2..245473a188e 100644 --- a/tools/marvin/marvin/configGenerator.py +++ b/tools/marvin/marvin/configGenerator.py @@ -332,7 +332,10 @@ class ConfigManager(object): "getConfig" API,once configObj is returned. ''' def __init__(self, cfg_file=None): - self.__filePath = cfg_file + if cfg_file is None: + self.__filePath = "config/test_data.cfg" + else: + self.__filePath = cfg_file self.__parsedCfgDict = None ''' Set the Configuration @@ -340,11 +343,8 @@ class ConfigManager(object): self.__setConfig() def __setConfig(self): - if not self.__verifyFile(): - dirPath = os.path.dirname(__file__) - self.__filePath = os.path.join(dirPath,"config/test_data.cfg") - self.__parsedCfgDict = self.__parseConfig() - print "*************PATH3***************",self.__filePath,self.__parsedCfgDict + if self.__verifyFile() is not False: + self.__parsedCfgDict = self.__parseConfig() def __parseConfig(self): ''' @@ -382,7 +382,7 @@ class ConfigManager(object): ''' if self.__filePath is None or self.__filePath == '': return False - return os.path.exists(self.__filePath) + return False if os.path.exists(self.__filePath) is False else True def getSectionData(self, section=None): ''' diff --git a/tools/marvin/marvin/dbConnection.py b/tools/marvin/marvin/dbConnection.py index ba7bac9fa95..422fcfa8f21 100644 --- a/tools/marvin/marvin/dbConnection.py +++ b/tools/marvin/marvin/dbConnection.py @@ -20,7 +20,7 @@ import contextlib from mysql import connector from mysql.connector import errors from contextlib import closing -from marvin import cloudstackException +import cloudstackException import sys import os diff --git a/tools/marvin/marvin/deployDataCenter.py b/tools/marvin/marvin/deployDataCenter.py index c8feaafcf67..862a1bfd3ee 100644 --- a/tools/marvin/marvin/deployDataCenter.py +++ b/tools/marvin/marvin/deployDataCenter.py @@ -686,7 +686,7 @@ if __name__ == "__main__": log_check = False if log_obj is not None: log_check = True - ret = log_obj.createLogs("DeployDataCenter", + ret = log_obj.createLogs("DataCenter", cfg.logger) if ret != FAILED: log_folder_path = log_obj.getLogFolderPath() diff --git a/tools/marvin/marvin/lib/utils.py b/tools/marvin/marvin/lib/utils.py index 440ff7795c5..957807d84b1 100644 --- a/tools/marvin/marvin/lib/utils.py +++ b/tools/marvin/marvin/lib/utils.py @@ -30,7 +30,7 @@ import urlparse import datetime from platform import system from marvin.cloudstackAPI import cloudstackAPIClient, listHosts -from marvin.cloudstackException import GetDetailExceptionInfo +from cloudstackException import GetDetailExceptionInfo from marvin.sshClient import SshClient from marvin.codes import ( SUCCESS, diff --git a/tools/marvin/marvin/marvinInit.py b/tools/marvin/marvin/marvinInit.py index e61c8ecd0d1..5218d235da4 100644 --- a/tools/marvin/marvin/marvinInit.py +++ b/tools/marvin/marvin/marvinInit.py @@ -15,17 +15,18 @@ # specific language governing permissions and limitations # under the License. ''' -Initializes the marvin and does required prerequisites +@Desc: Initializes the marvin and does required prerequisites for starting it. 1. Parses the configuration file passed to marvin and creates a - parsed config. + parsed config 2. Initializes the logging required for marvin.All logs are now made available under a single timestamped folder. - 3. Deploys the Data Center based upon input. + 3. Deploys the Data Center based upon input ''' -from marvin.configGenerator import getSetupConfig +from marvin import configGenerator +from marvin import cloudstackException from marvin.marvinLog import MarvinLog from marvin.deployDataCenter import DeployDataCenters from marvin.cloudstackTestClient import CSTestClient @@ -48,30 +49,32 @@ from marvin.codegenerator import CodeGenerator class MarvinInit: - def __init__(self, config_file, + def __init__(self, config_file, load_api_flag=None, deploy_dc_flag=None, - test_mod_name="deploydc", + test_module_name=None, zone=None): self.__configFile = config_file self.__deployFlag = deploy_dc_flag + self.__loadApiFlag = load_api_flag self.__parsedConfig = None self.__logFolderPath = None self.__tcRunLogger = None - self.__testModName = test_mod_name self.__testClient = None self.__tcResultFile = None + self.__testModuleName = test_module_name self.__testDataFilePath = None self.__zoneForTests = None def __parseConfig(self): ''' - @Name: __parseConfig @Desc : Parses the configuration file passed and assigns the parsed configuration - @Output : SUCCESS or FAILED ''' try: - self.__parsedConfig = getSetupConfig(self.__configFile) + if self.__configFile is None: + return FAILED + self.__parsedConfig = configGenerator.\ + getSetupConfig(self.__configFile) return SUCCESS except Exception, e: print "\nException Occurred Under __parseConfig : " \ @@ -90,13 +93,7 @@ class MarvinInit: def getLogger(self): return self.__tcRunLogger - def getResultFile(self): - ''' - @Name : getDebugFile - @Desc : Creates the result file at a given path. - @Output : Returns the Result file to be used for writing - test outputs - ''' + def getDebugFile(self): if self.__logFolderPath is not None: self.__tcResultFile = open(self.__logFolderPath + "/results.txt", "w") @@ -111,14 +108,14 @@ class MarvinInit: 2. Creates a timestamped log folder and provides all logs to be dumped there 3. Creates the DataCenter based upon configuration provided - @Output : SUCCESS or FAILED ''' try: if ((self.__parseConfig() != FAILED) and (self.__setTestDataPath() != FAILED) and (self.__initLogging() != FAILED) and (self.__createTestClient() != FAILED) and - (self.__deployDC() != FAILED)): + (self.__deployDC() != FAILED) and + (self.__loadNewApiFromXml() != FAILED)): return SUCCESS else: return FAILED @@ -128,9 +125,9 @@ class MarvinInit: return FAILED def __initLogging(self): - ''' - @Name : __initLogging - @Desc : 1. Initializes the logging for marvin and so provides + try: + ''' + @Desc : 1. Initializes the logging for marvin and so provides various log features for automation run. 2. Initializes all logs to be available under given Folder Path,where all test run logs @@ -138,19 +135,18 @@ class MarvinInit: 3. All logging like exception log,results, run info etc for a given test run are available under a given timestamped folder - @Output : SUCCESS or FAILED - ''' - try: + ''' log_obj = MarvinLog("CSLog") - if log_obj: + if log_obj is None: + return FAILED + else: ret = log_obj.\ - createLogs(self.__testModName, + getLogs(self.__testModuleName, self.__parsedConfig.logger) if ret != FAILED: self.__logFolderPath = log_obj.getLogFolderPath() self.__tcRunLogger = log_obj.getLogger() - return SUCCESS - return FAILED + return SUCCESS except Exception, e: print "\n Exception Occurred Under __initLogging " \ ":%s" % GetDetailExceptionInfo(e) @@ -161,7 +157,6 @@ class MarvinInit: @Name : __createTestClient @Desc : Creates the TestClient during init based upon the parameters provided - @Output: Returns SUCCESS or FAILED ''' try: mgt_details = self.__parsedConfig.mgtSvr[0] @@ -171,7 +166,7 @@ class MarvinInit: test_data_filepath= self.__testDataFilePath, zone=self.__zoneForTests) - if self.__testClient: + if self.__testClient is not None: return self.__testClient.createTestClient() else: return FAILED @@ -180,12 +175,37 @@ class MarvinInit: GetDetailExceptionInfo(e) return FAILED + def __loadNewApiFromXml(self): + try: + if self.__loadApiFlag: + apiLoadCfg = self.__parsedConfig.apiLoadCfg + api_dst_dir = apiLoadCfg.ParsedApiDestFolder + "/cloudstackAPI" + api_spec_file = apiLoadCfg.ApiSpecFile + + if not os.path.exists(api_dst_dir): + try: + os.mkdir(api_dst_dir) + except Exception, e: + print "Failed to create folder %s, " \ + "due to %s" % (api_dst_dir, + GetDetailExceptionInfo(e)) + exit(1) + mgt_details = self.__parsedConfig.mgtSvr[0] + cg = CodeGenerator(api_dst_dir) + if os.path.exists(api_spec_file): + cg.generateCodeFromXML(api_spec_file) + elif mgt_details is not None: + endpoint_url = 'http://%s:8096/client/api?' \ + 'command=listApis&response=json' \ + % mgt_details.mgtSvrIp + cg.generateCodeFromJSON(endpoint_url) + return SUCCESS + except Exception, e: + print "\n Exception Occurred Under __loadNewApiFromXml : %s" \ + % GetDetailExceptionInfo(e) + return FAILED + def __setTestDataPath(self): - ''' - @Name : __setTestDataPath - @Desc : Sets the TestData Path for tests to run - @Output:Returns SUCCESS or FAILED - ''' try: if ((self.__parsedConfig.TestData is not None) and (self.__parsedConfig.TestData.Path is not None)): @@ -197,23 +217,14 @@ class MarvinInit: return FAILED def __deployDC(self): - ''' - @Name : __deployDC - @Desc : Deploy the DataCenter and returns accordingly. - @Output: SUCCESS or FAILED - ''' try: - ret = SUCCESS - if self.__deployFlag: - deploy_obj = DeployDataCenters(self.__testClient, + ''' + Deploy the DataCenter and retrieves test client. + ''' + deploy_obj = DeployDataCenters(self.__testClient, self.__parsedConfig, self.__tcRunLogger) - ret = deploy_obj.deploy() - if ret == SUCCESS: - print "Deploy DC Successful" - else: - print "Deploy DC Failed" - return ret + return deploy_obj.deploy() if self.__deployFlag else FAILED except Exception, e: print "\n Exception Occurred Under __deployDC : %s" % \ GetDetailExceptionInfo(e) diff --git a/tools/marvin/marvin/marvinLog.py b/tools/marvin/marvin/marvinLog.py index 933a2717939..4161eca7274 100644 --- a/tools/marvin/marvin/marvinLog.py +++ b/tools/marvin/marvin/marvinLog.py @@ -65,11 +65,9 @@ class MarvinLog: self.__logger = logging.getLogger(self.__loggerName) self.__logger.setLevel(logging.DEBUG) - def __setLogHandler(self, log_file_path, - log_format=None, + def __setLogHandler(self, log_file_path, log_format=None, log_level=logging.DEBUG): ''' - @Name : __setLogHandler @Desc: Adds the given Log handler to the current logger @Input: log_file_path: Log File Path as where to store the logs log_format : Format of log messages to be dumped @@ -102,8 +100,7 @@ class MarvinLog: @Input: logfolder_to_remove: Path of Log to remove ''' try: - if os.path.isdir(logfolder_to_remove): - os.rmdir(logfolder_to_remove) + os.rmdir(logfolder_to_remove) except Exception, e: print "\n Exception Occurred Under __cleanPreviousLogs :%s" % \ GetDetailExceptionInfo(e) @@ -123,9 +120,7 @@ class MarvinLog: ''' return self.__logFolderDir - def createLogs(self, - test_module_name=None, - log_cfg=None): + def createLogs(self, test_module_name=None, log_cfg=None): ''' @Name : createLogs @Desc : Gets the Logger with file paths initialized and created @@ -136,15 +131,21 @@ class MarvinLog: @Output : SUCCESS\FAILED ''' try: - temp_ts = time.strftime("%b_%d_%Y_%H_%M_%S", - time.localtime()) + if log_cfg is None: + print "\nInvalid Log Folder Configuration." \ + "Please Check Config File" + return FAILED if test_module_name is None: - temp_path = temp_ts + temp_path = time.strftime("%b_%d_%Y_%H_%M_%S", + time.localtime()) else: - temp_path = str(test_module_name) + "__" + str(temp_ts) + temp_path = str(test_module_name.split(".py")[0]) - if ((log_cfg is not None) and ('LogFolderPath' in log_cfg.__dict__.keys()) and + if (('LogFolderPath' in log_cfg.__dict__.keys()) and (log_cfg.__dict__.get('LogFolderPath') is not None)): + self.__cleanPreviousLogs(log_cfg. + __dict__. + get('LogFolderPath') + "/MarvinLogs") temp_dir = \ log_cfg.__dict__.get('LogFolderPath') + "/MarvinLogs" else: diff --git a/tools/marvin/marvin/marvinPlugin.py b/tools/marvin/marvin/marvinPlugin.py index f69366b1389..f36bca87ca0 100644 --- a/tools/marvin/marvin/marvinPlugin.py +++ b/tools/marvin/marvin/marvinPlugin.py @@ -14,11 +14,10 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. + import marvin import sys import logging -import time -import os import nose.core from marvin.cloudstackTestCase import cloudstackTestCase from marvin.marvinInit import MarvinInit @@ -26,7 +25,9 @@ from nose.plugins.base import Plugin from marvin.codes import (SUCCESS, FAILED, EXCEPTION) -from marvin.cloudstackException import GetDetailExceptionInfo +from marvin.cloudstackException import GetDetailExceptionInfo +import time +import os class MarvinPlugin(Plugin): @@ -37,28 +38,32 @@ class MarvinPlugin(Plugin): name = "marvin" def __init__(self): - self.__identifier = None - self.__testClient = None - self.__parsedConfig = None + self.identifier = None + self.testClient = None + self.parsedConfig = None ''' Contains Config File ''' self.__configFile = None ''' + Signifies the flag whether to load new API Information + ''' + self.__loadNewApiFlag = None + ''' Signifies the Zone against which all tests will be Run ''' self.__zoneForTests = None ''' Signifies the flag whether to deploy the New DC or Not ''' - self.__deployDcFlag = None + self.__deployDcFlag self.conf = None - self.__debugStream = sys.stdout - self.__testRunner = None - self.__testResult = SUCCESS - self.__startTime = None - self.__testName = None - self.__tcRunLogger = None + self.debugStream = sys.stdout + self.testRunner = None + self.testResult = SUCCESS + self.startTime = None + self.testName = None + self.tcRunLogger = None Plugin.__init__(self) def configure(self, options, conf): @@ -73,11 +78,12 @@ class MarvinPlugin(Plugin): return else: self.enabled = True - self.__configFile = options.configFile + + self.__configFile = options.config_file + self.__loadNewApiFlag = options.loadNewApiFlag self.__deployDcFlag = options.deployDc self.__zoneForTests = options.zone self.conf = conf - self.startMarvin() def options(self, parser, env): """ @@ -86,20 +92,32 @@ class MarvinPlugin(Plugin): parser.add_option("--marvin-config", action="store", default=env.get('MARVIN_CONFIG', './datacenter.cfg'), - dest="configFile", + dest="config_file", help="Marvin's configuration file is required." "The config file containing the datacenter and " "other management server " "information is specified") - parser.add_option("--deploy", action="store_true", + parser.add_option("--deploy-dc", action="store_true", default=False, dest="deployDc", help="Deploys the DC with Given Configuration." "Requires only when DC needs to be deployed") - parser.add_option("--zone", action="store_true", + parser.add_option("--zone", action="zone_tests", default=None, dest="zone", help="Runs all tests against this specified zone") + parser.add_option("--load-new-apis", action="store_true", + default=False, + dest="loadNewApiFlag", + help="Loads the New Apis with Given Api Xml File." + "Creates the new Api's from commands.xml File") + ''' + Check if the configuration file is not valid,print and exit + ''' + (options, args) = parser.parse_args() + if options.config_file is None: + parser.print_usage() + sys.exit(1) Plugin.options(self, parser, env) def wantClass(self, cls): @@ -109,9 +127,17 @@ class MarvinPlugin(Plugin): return True return None + def prepareTest(self, test): + ''' + @Desc : Initializes the marvin with required settings + ''' + test_module_name = test.__str__() + if self.startMarvin(test_module_name) == FAILED: + print "Starting Marvin FAILED. Please Check Config and " \ + "Arguments Supplied" + def __checkImport(self, filename): ''' - @Name : __checkImport @Desc : Verifies to Import the test Module before running and check whether if it is importable. This will check for test modules which has some issues to be @@ -119,125 +145,94 @@ class MarvinPlugin(Plugin): Returns False or True based upon the result. ''' try: - if os.path.isfile(filename): - ret = os.path.splitext(filename) - if ret[1] == ".py": - os.system("python "+ filename) - return True - return False + __import__(filename) + return True except ImportError, e: - print "FileName :%s : Error : %s"%(filename,GetDetailExceptionInfo(e)) + self.tcRunLogger.exception("Module : %s Import " + "Failed Reason :%s" + % (filename, GetDetailExceptionInfo(e))) return False def wantFile(self, filename): ''' @Desc : Only python files will be used as test modules ''' - return self.__checkImport(filename) + if filename is None or filename == '': + return False + parts = filename.split(os.path.sep) + base, ext = os.path.splitext(parts[-1]) + if ext != '.py': + return False + else: + return self.__checkImport(filename) def loadTestsFromTestCase(self, cls): if cls.__name__ != 'cloudstackTestCase': - self.__identifier = cls.__name__ + self.identifier = cls.__name__ self._injectClients(cls) def beforeTest(self, test): - self.__testName = test.__str__().split()[0] - self.__testClient.identifier = '-'.join([self.__identifier, self.__testName]) - if self.__tcRunLogger: - self.__tcRunLogger.name = test.__str__() + self.testName = test.__str__().split()[0] + self.testClient.identifier = '-'.join([self.identifier, self.testName]) + self.tcRunLogger.name = test.__str__() + + def prepareTestRunner(self, runner): + return self.testRunner def startTest(self, test): """ Currently used to record start time for tests Dump Start Msg of TestCase to Log """ - if self.__tcRunLogger: - self.__tcRunLogger.debug("\n\n::::::::::::STARTED : TC: " + - str(self.__testName) + " :::::::::::") - self.__startTime = time.time() + self.tcRunLogger.debug("\n\n::::::::::::STARTED : TC: " + + str(self.testName) + " :::::::::::") + self.startTime = time.time() def handleError(self, test, err): ''' Adds Exception throwing test cases and information to log. ''' - if self.__tcRunLogger: - self.__tcRunLogger.fatal("%s: %s: %s" % - (EXCEPTION, self.__testName, GetDetailExceptionInfo(err))) - self.__testResult = EXCEPTION + err_msg = GetDetailExceptionInfo(err) + self.tcRunLogger.fatal("%s: %s: %s" % + (EXCEPTION, self.testName, err_msg)) + self.testResult = EXCEPTION def handleFailure(self, test, err): ''' Adds Failing test cases and information to log. ''' - if self.__tcRunLogger: - self.__tcRunLogger.fatal("%s: %s: %s" % - (FAILED, self.__testName, GetDetailExceptionInfo(err))) - self.__testResult = FAILED + err_msg = GetDetailExceptionInfo(err) + self.tcRunLogger.fatal("%s: %s: %s" % + (FAILED, self.testName, err_msg)) + self.testResult = FAILED - def __getModName(self,inp, type='file'): + def startMarvin(self, test_module_name): ''' - @Desc : Returns the module name from the path - @Output: trimmed down module name, used for logging - @Input: type:Whether the type is file or dir - inp:input element - ''' - if type == 'file': - temp = os.path.splitext(inp)[0] - return os.path.split(temp)[-1] - if type == 'dir': - return os.path.split(inp)[-1] - - def __runSuite(self, test_suite=None): - try: - if test_suite: - if self.wantFile(test_suite) == True: - test_mod_name = self.__getModName(test_suite) - temp_obj = MarvinInit(self.__configFile, - None, - test_mod_name, - self.__zoneForTests) - if temp_obj and temp_obj.init() == SUCCESS: - self.__testClient = temp_obj.getTestClient() - self.__tcRunLogger = temp_obj.getLogger() - self.__parsedConfig = temp_obj.getParsedConfig() - self.__debugStream = temp_obj.getResultFile() - self.__testRunner = nose.core.TextTestRunner(stream=self.__debugStream, - descriptions=True, - verbosity=2) - #if self.__testRunner: - # self.__testRunner.run(test_suite) - return SUCCESS - except Exception,e: - print "\n Exception Occurred when running suite :%s Error : %s" % (test_suite, GetDetailExceptionInfo(e)) - return FAILED - - def __runSuites(self, suites): - for suite in suites: - self.__runSuite(suite) - - def startMarvin(self): - ''' - @Name : startMarvin - @Desc : Initializes the Marvin - creates the test Client - creates the runlogger for logging - Parses the config and creates a parsedconfig - Creates a debugstream for tc debug log + Initializes the Marvin + creates the test Client + creates the runlogger for logging + Parses the config and creates a parsedconfig + Creates a debugstream for tc debug log ''' try: obj_marvininit = MarvinInit(self.__configFile, + self.__loadNewApiFlag, self.__deployDcFlag, - self.__zoneForTests) - if obj_marvininit and obj_marvininit.init() == SUCCESS: - print "\nMarvin Initialization Successful" - for suites in self.conf.testNames: - if os.path.isdir(suites): - self.__runSuites(suites) - if os.path.isfile(suites): - self.__runSuite(suites) + test_module_name, + self.__zoneForoTests) + if obj_marvininit.init() == SUCCESS: + self.testClient = obj_marvininit.getTestClient() + self.tcRunLogger = obj_marvininit.getLogger() + self.parsedConfig = obj_marvininit.getParsedConfig() + self.debugStream = obj_marvininit.getDebugFile() + self.testRunner = nose.core.TextTestRunner(stream= + self.debugStream, + descriptions=True, + verbosity=2, + config=self.conf) return SUCCESS - print "\nMarvin Initialization Failed" - return FAILED + else: + return FAILED except Exception, e: print "Exception Occurred under startMarvin: %s" % \ GetDetailExceptionInfo(e) @@ -248,29 +243,28 @@ class MarvinPlugin(Plugin): Currently used to record end time for tests """ endTime = time.time() - if self.__startTime: - totTime = int(endTime - self.__startTime) - if self.__tcRunLogger: - self.__tcRunLogger.debug("TestCaseName: %s; Time Taken: " + if self.startTime is not None: + totTime = int(endTime - self.startTime) + self.tcRunLogger.debug("TestCaseName: %s; Time Taken: " "%s Seconds; " "StartTime: %s; EndTime: %s; Result: %s" - % (self.__testName, str(totTime), - str(time.ctime(self.__startTime)), + % (self.testName, str(totTime), + str(time.ctime(self.startTime)), str(time.ctime(endTime)), - self.__testResult)) + self.testResult)) def _injectClients(self, test): - setattr(test, "debug", self.__tcRunLogger.debug) - setattr(test, "info", self.__tcRunLogger.info) - setattr(test, "warn", self.__tcRunLogger.warning) - setattr(test, "error", self.__tcRunLogger.error) - setattr(test, "testClient", self.__testClient) - setattr(test, "config", self.__parsedConfig) - if self.__testClient.identifier is None: - self.__testClient.identifier = self.__identifier - setattr(test, "clstestclient", self.__testClient) + setattr(test, "debug", self.tcRunLogger.debug) + setattr(test, "info", self.tcRunLogger.info) + setattr(test, "warn", self.tcRunLogger.warning) + setattr(test, "error", self.tcRunLogger.error) + setattr(test, "testClient", self.testClient) + setattr(test, "config", self.parsedConfig) + if self.testClient.identifier is None: + self.testClient.identifier = self.identifier + setattr(test, "clstestclient", self.testClient) if hasattr(test, "user"): # when the class-level attr applied. all test runs as 'user' - self.__testClient.getUserApiClient(test.UserName, + self.testClient.getUserApiClient(test.UserName, test.DomainName, test.AcctType) diff --git a/tools/marvin/marvin/sshClient.py b/tools/marvin/marvin/sshClient.py index c24477cb999..9b5bca2632e 100644 --- a/tools/marvin/marvin/sshClient.py +++ b/tools/marvin/marvin/sshClient.py @@ -25,7 +25,7 @@ from paramiko import (BadHostKeyException, SFTPClient) import socket import time -from marvin.cloudstackException import ( +from cloudstackException import ( internalError, GetDetailExceptionInfo )