From 3493f17bad3b8b57778b62d464c5e7f910351cc0 Mon Sep 17 00:00:00 2001 From: Girish Shilamkar Date: Sun, 9 Feb 2014 16:02:52 -0500 Subject: [PATCH] CLOUDSTACK-5674: Few new fixes --- setup/dev/advanced.cfg | 2 +- test/integration/smoke/test_deploy_vm.py | 2 +- .../smoke/test_deploy_vm_with_userdata.py | 2 +- ...ploy_vms_with_varied_deploymentplanners.py | 2 +- .../smoke/test_guest_vlan_range.py | 2 +- test/integration/smoke/test_hosts.py | 2 +- test/integration/smoke/test_internal_lb.py | 2 +- test/integration/smoke/test_iso.py | 2 +- test/integration/smoke/test_loadbalance.py | 2 +- .../smoke/test_multipleips_per_nic.py | 2 +- test/integration/smoke/test_network.py | 4 +- test/integration/smoke/test_network_acl.py | 2 +- test/integration/smoke/test_nic.py | 2 +- .../smoke/test_portable_publicip.py | 2 +- .../integration/smoke/test_primary_storage.py | 2 +- .../integration/smoke/test_public_ip_range.py | 2 +- .../smoke/test_reset_vm_on_reboot.py | 2 +- .../integration/smoke/test_resource_detail.py | 2 +- test/integration/smoke/test_routers.py | 2 +- test/integration/smoke/test_scale_vm.py | 2 +- .../smoke/test_service_offerings.py | 2 +- test/integration/smoke/test_snapshots.py | 2 +- test/integration/smoke/test_ssvm.py | 2 +- test/integration/smoke/test_templates.py | 2 +- test/integration/smoke/test_vm_life_cycle.py | 2 +- test/integration/smoke/test_vm_snapshots.py | 2 +- test/integration/smoke/test_volumes.py | 6 +- test/integration/smoke/test_vpc_vpn.py | 2 +- tools/marvin/marvin/asyncJobMgr.py | 2 +- tools/marvin/marvin/cloudstackConnection.py | 2 +- tools/marvin/marvin/cloudstackTestClient.py | 39 +-- tools/marvin/marvin/configGenerator.py | 14 +- tools/marvin/marvin/dbConnection.py | 2 +- tools/marvin/marvin/deployDataCenter.py | 2 +- tools/marvin/marvin/lib/utils.py | 2 +- tools/marvin/marvin/marvinInit.py | 111 ++++----- tools/marvin/marvin/marvinLog.py | 27 +- tools/marvin/marvin/marvinPlugin.py | 232 +++++++++--------- tools/marvin/marvin/sshClient.py | 2 +- 39 files changed, 248 insertions(+), 249 deletions(-) diff --git a/setup/dev/advanced.cfg b/setup/dev/advanced.cfg index 15d10572b8b..199571d335b 100644 --- a/setup/dev/advanced.cfg +++ b/setup/dev/advanced.cfg @@ -226,6 +226,6 @@ }, "TestData": { - "Path": "config/config.cfg" + "Path": "" } } diff --git a/test/integration/smoke/test_deploy_vm.py b/test/integration/smoke/test_deploy_vm.py index 9b28186af29..9f40f78ad0a 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.testdata) + self.zone = get_zone(self.apiclient, self.testClient.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_deploy_vm_with_userdata.py b/test/integration/smoke/test_deploy_vm_with_userdata.py index 27dce50f17e..eb03194db3a 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, cls.getZoneForTests()) + cls.zone = get_zone(cls.apiClient, testClient.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 270d9d2997d..c0c77e78bef 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, cls.getZoneForTests()) + cls.zone = get_zone(cls.apiclient, testClient.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 886d1b87dce..ecf7a0d0727 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, cls.getZoneForTests()) + cls.zone = get_zone(cls.apiclient, testClient.getZoneForTests()) # Create Account cls.account = Account.create( diff --git a/test/integration/smoke/test_hosts.py b/test/integration/smoke/test_hosts.py index 57c35f57afc..31af7fca6e7 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.getZoneForTests()) + self.zone = get_zone(self.apiclient, self.testClient.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 5a9127b83b7..8a64b4dc12c 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, cls.getZoneForTests()) + cls.zone = get_zone(cls.apiclient, testClient.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 0aec94c9f3f..72dc70d97fc 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.getZoneForTests()) + self.zone = get_zone(self.apiclient, self.testClient.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 c9fe2e043f9..28a14e4420f 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, cls.getZoneForTests()) + cls.zone = get_zone(cls.apiclient, testClient.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 8acf28534f1..9c7f2f75a38 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.getZoneForTests()) + self.zone = get_zone(self.apiclient, self.testClient.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 566bd37337e..258d2546cd2 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, cls.getZoneForTests()) + cls.zone = get_zone(cls.apiclient, testClient.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.getZoneForTests()) + self.zone = get_zone(self.apiclient, self.testClient.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 50bbbf3be00..1133bee0af1 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, cls.getZoneForTests()) + cls.zone = get_zone(cls.apiclient, testClient.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 4ee43b5e8f9..0e866b8b7b3 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.getZoneForTests()) + zone = get_zone(self.apiclient, self.testClient.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 37aaada6e9b..48310a5cbf4 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.getZoneForTests()) + cls.zone = get_zone(cls.apiclient, cls.testClient.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 9437b3d8b01..8f89f4f8972 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.getZoneForTests()) + self.zone = get_zone(self.apiclient, self.testClient.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 998bda25331..ae9b64bf87f 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.getZoneForTests()) + cls.zone = get_zone(cls.apiclient, cls.getClsTestClient.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 fac96fa2557..253f0f4aaf9 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, cls.getZoneForTests()) + zone = get_zone(cls.apiclient, testClient.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 e7081f75e52..1613a4ade3e 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, cls.getZoneForTests()) + zone = get_zone(cls.apiclient, testClient.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 61dc5be8a6f..0c91b9f1c29 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, cls.getZoneForTests()) + cls.zone = get_zone(cls.apiclient, testClient.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 6fa8d7750f0..5ab4463e312 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, cls.getZoneForTests()) + zone = get_zone(cls.apiclient, testClient.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 b518c98d53b..0c7752d1bbd 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, cls.getZoneForTests()) + cls.zone = get_zone(cls.apiclient, testClient.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 312da458ee4..d475d87059c 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, cls.getZoneForTests()) + cls.zone = get_zone(cls.apiclient, testClient.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 d8e9f8562c9..3ba73033243 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.getZoneForTests()) + self.zone = get_zone(self.apiclient, self.testClient.getZoneForTests()) return def tearDown(self): diff --git a/test/integration/smoke/test_templates.py b/test/integration/smoke/test_templates.py index 71aee48ab9a..26bbb5504d1 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, cls.getZoneForTests()) + cls.zone = get_zone(cls.apiclient, testClient.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 31031c892b0..05ecba5a7f0 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, cls.getZoneForTests()) + cls.zone = get_zone(cls.apiclient, testClient.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 86af0138c90..6f64802701f 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.getZoneForTests()) + cls.zone = get_zone(cls.apiclient, cls.getClsTestClient().getZoneForTests()) template = get_template( cls.apiclient, diff --git a/test/integration/smoke/test_volumes.py b/test/integration/smoke/test_volumes.py index f650dd56766..67b986f1a03 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, cls.getZoneForTests()) + cls.zone = get_zone(cls.apiclient, testClient.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, cls.getZoneForTests()) + cls.zone = get_zone(cls.apiclient, testClient.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 56215c15dca..4ec2da11dae 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, cls.getZoneForTests()) + cls.zone = get_zone(cls.apiclient, testClient.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 dab85ca39a7..ee3ae5ad3d5 100644 --- a/tools/marvin/marvin/asyncJobMgr.py +++ b/tools/marvin/marvin/asyncJobMgr.py @@ -16,7 +16,7 @@ # under the License. import threading -import cloudstackException +from marvin import cloudstackException import time import Queue import copy diff --git a/tools/marvin/marvin/cloudstackConnection.py b/tools/marvin/marvin/cloudstackConnection.py index b8d9a381129..ee1ff00a907 100644 --- a/tools/marvin/marvin/cloudstackConnection.py +++ b/tools/marvin/marvin/cloudstackConnection.py @@ -38,7 +38,7 @@ from requests import ( Timeout, RequestException ) -from cloudstackException import GetDetailExceptionInfo +from marvin.cloudstackException import GetDetailExceptionInfo class CSConnection(object): diff --git a/tools/marvin/marvin/cloudstackTestClient.py b/tools/marvin/marvin/cloudstackTestClient.py index e8c6ab24952..a1b8e19648a 100644 --- a/tools/marvin/marvin/cloudstackTestClient.py +++ b/tools/marvin/marvin/cloudstackTestClient.py @@ -26,26 +26,25 @@ from codes import (FAILED, PASS, ADMIN, DOMAIN_ADMIN, USER, SUCCESS, XEN_SERVER) from configGenerator import ConfigManager from marvin.lib import utils -from cloudstackException import GetDetailExceptionInfo +from marvin.cloudstackException import GetDetailExceptionInfo from marvin.lib.utils import (random_gen, validateList) from marvin.cloudstackAPI.cloudstackAPIClient import CloudStackAPIClient -''' -@Desc : CloudStackTestClient is encapsulated entity for creating and +class CSTestClient(object): + ''' + @Desc : CloudStackTestClient is encapsulated entity for creating and getting various clients viz., apiclient, user api client, dbconnection, test Data parsed information etc -@Input : mgmtDetails : Management Server Details - dbSvrDetails: Database Server details of Management \ + @Input : + mgmt_details : Management Server Details + dbsvr_details: Database Server details of Management \ Server. Retrieved from configuration file. - asyncTimeout : Timeout for Async queries - defaultWorkerThreads : Number of worker threads + async_timeout : Timeout for Async queries + default_worker_threads : 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, @@ -133,9 +132,9 @@ class CSTestClient(object): list_user = listUsers.listUsersCmd() list_user.account = "admin" list_user_res = self.__apiClient.listUsers(list_user) - if list_user_res is None or\ + if list_user_res == FAILED or list_user_res is None or\ (validateList(list_user_res)[0] != PASS): - self.__logger.debug("__createApiClient: API " + self.__logger.error("__createApiClient: API " "Client Creation Failed") return FAILED @@ -200,7 +199,6 @@ 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) @@ -232,9 +230,11 @@ 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 is not None: + if self.__configObj: self.__parsedTestDataConfig = self.__configObj.getConfig() + print "\n**************************************HTTTTTT***",self.__parsedTestDataConfig else: self.__logger.error("createTestClient : Not able to create " "ConfigManager Object") @@ -246,7 +246,12 @@ class CSTestClient(object): ''' 3. Creates API Client ''' - return self.__createApiClient() + ret = self.__createApiClient() + if ret == FAILED: + self.__logger.error("********Test Client Creation Failed********") + else: + self.__logger.debug("********Test Client Creation Successful********") + return ret except Exception, e: self.__logger.exception("Exception Occurred " "Under createTestClient " @@ -368,7 +373,7 @@ class CSTestClient(object): return self.__configObj def getApiClient(self): - if self.__apiClient is not None: + if self.__apiClient: 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 245473a188e..f55b0b4cde2 100644 --- a/tools/marvin/marvin/configGenerator.py +++ b/tools/marvin/marvin/configGenerator.py @@ -332,10 +332,7 @@ class ConfigManager(object): "getConfig" API,once configObj is returned. ''' def __init__(self, cfg_file=None): - if cfg_file is None: - self.__filePath = "config/test_data.cfg" - else: - self.__filePath = cfg_file + self.__filePath = cfg_file self.__parsedCfgDict = None ''' Set the Configuration @@ -343,8 +340,11 @@ class ConfigManager(object): self.__setConfig() def __setConfig(self): - if self.__verifyFile() is not False: - self.__parsedCfgDict = self.__parseConfig() + 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 def __parseConfig(self): ''' @@ -382,7 +382,7 @@ class ConfigManager(object): ''' if self.__filePath is None or self.__filePath == '': return False - return False if os.path.exists(self.__filePath) is False else True + return os.path.exists(self.__filePath) def getSectionData(self, section=None): ''' diff --git a/tools/marvin/marvin/dbConnection.py b/tools/marvin/marvin/dbConnection.py index 422fcfa8f21..ba7bac9fa95 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 -import cloudstackException +from marvin import cloudstackException import sys import os diff --git a/tools/marvin/marvin/deployDataCenter.py b/tools/marvin/marvin/deployDataCenter.py index 862a1bfd3ee..c8feaafcf67 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("DataCenter", + ret = log_obj.createLogs("DeployDataCenter", 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 957807d84b1..440ff7795c5 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 cloudstackException import GetDetailExceptionInfo +from marvin.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 5218d235da4..e61c8ecd0d1 100644 --- a/tools/marvin/marvin/marvinInit.py +++ b/tools/marvin/marvin/marvinInit.py @@ -15,18 +15,17 @@ # specific language governing permissions and limitations # under the License. ''' -@Desc: Initializes the marvin and does required prerequisites +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 import configGenerator -from marvin import cloudstackException +from marvin.configGenerator import getSetupConfig from marvin.marvinLog import MarvinLog from marvin.deployDataCenter import DeployDataCenters from marvin.cloudstackTestClient import CSTestClient @@ -49,32 +48,30 @@ from marvin.codegenerator import CodeGenerator class MarvinInit: - def __init__(self, config_file, load_api_flag=None, + def __init__(self, config_file, deploy_dc_flag=None, - test_module_name=None, + test_mod_name="deploydc", 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: - if self.__configFile is None: - return FAILED - self.__parsedConfig = configGenerator.\ - getSetupConfig(self.__configFile) + self.__parsedConfig = getSetupConfig(self.__configFile) return SUCCESS except Exception, e: print "\nException Occurred Under __parseConfig : " \ @@ -93,7 +90,13 @@ class MarvinInit: def getLogger(self): return self.__tcRunLogger - def getDebugFile(self): + 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 + ''' if self.__logFolderPath is not None: self.__tcResultFile = open(self.__logFolderPath + "/results.txt", "w") @@ -108,14 +111,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) and - (self.__loadNewApiFromXml() != FAILED)): + (self.__deployDC() != FAILED)): return SUCCESS else: return FAILED @@ -125,9 +128,9 @@ class MarvinInit: return FAILED def __initLogging(self): - try: - ''' - @Desc : 1. Initializes the logging for marvin and so provides + ''' + @Name : __initLogging + @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 @@ -135,18 +138,19 @@ 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 is None: - return FAILED - else: + if log_obj: ret = log_obj.\ - getLogs(self.__testModuleName, + createLogs(self.__testModName, self.__parsedConfig.logger) if ret != FAILED: self.__logFolderPath = log_obj.getLogFolderPath() self.__tcRunLogger = log_obj.getLogger() - return SUCCESS + return SUCCESS + return FAILED except Exception, e: print "\n Exception Occurred Under __initLogging " \ ":%s" % GetDetailExceptionInfo(e) @@ -157,6 +161,7 @@ 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] @@ -166,7 +171,7 @@ class MarvinInit: test_data_filepath= self.__testDataFilePath, zone=self.__zoneForTests) - if self.__testClient is not None: + if self.__testClient: return self.__testClient.createTestClient() else: return FAILED @@ -175,37 +180,12 @@ 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)): @@ -217,14 +197,23 @@ class MarvinInit: return FAILED def __deployDC(self): + ''' + @Name : __deployDC + @Desc : Deploy the DataCenter and returns accordingly. + @Output: SUCCESS or FAILED + ''' try: - ''' - Deploy the DataCenter and retrieves test client. - ''' - deploy_obj = DeployDataCenters(self.__testClient, + ret = SUCCESS + if self.__deployFlag: + deploy_obj = DeployDataCenters(self.__testClient, self.__parsedConfig, self.__tcRunLogger) - return deploy_obj.deploy() if self.__deployFlag else FAILED + ret = deploy_obj.deploy() + if ret == SUCCESS: + print "Deploy DC Successful" + else: + print "Deploy DC Failed" + return ret 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 4161eca7274..933a2717939 100644 --- a/tools/marvin/marvin/marvinLog.py +++ b/tools/marvin/marvin/marvinLog.py @@ -65,9 +65,11 @@ 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 @@ -100,7 +102,8 @@ class MarvinLog: @Input: logfolder_to_remove: Path of Log to remove ''' try: - os.rmdir(logfolder_to_remove) + if os.path.isdir(logfolder_to_remove): + os.rmdir(logfolder_to_remove) except Exception, e: print "\n Exception Occurred Under __cleanPreviousLogs :%s" % \ GetDetailExceptionInfo(e) @@ -120,7 +123,9 @@ 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 @@ -131,21 +136,15 @@ class MarvinLog: @Output : SUCCESS\FAILED ''' try: - if log_cfg is None: - print "\nInvalid Log Folder Configuration." \ - "Please Check Config File" - return FAILED - if test_module_name is None: - temp_path = time.strftime("%b_%d_%Y_%H_%M_%S", + temp_ts = time.strftime("%b_%d_%Y_%H_%M_%S", time.localtime()) + if test_module_name is None: + temp_path = temp_ts else: - temp_path = str(test_module_name.split(".py")[0]) + temp_path = str(test_module_name) + "__" + str(temp_ts) - if (('LogFolderPath' in log_cfg.__dict__.keys()) and + if ((log_cfg is not None) and ('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 f36bca87ca0..f69366b1389 100644 --- a/tools/marvin/marvin/marvinPlugin.py +++ b/tools/marvin/marvin/marvinPlugin.py @@ -14,10 +14,11 @@ # 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 @@ -25,9 +26,7 @@ from nose.plugins.base import Plugin from marvin.codes import (SUCCESS, FAILED, EXCEPTION) -from marvin.cloudstackException import GetDetailExceptionInfo -import time -import os +from marvin.cloudstackException import GetDetailExceptionInfo class MarvinPlugin(Plugin): @@ -38,32 +37,28 @@ 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 + self.__deployDcFlag = None 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): @@ -78,12 +73,11 @@ class MarvinPlugin(Plugin): return else: self.enabled = True - - self.__configFile = options.config_file - self.__loadNewApiFlag = options.loadNewApiFlag + self.__configFile = options.configFile self.__deployDcFlag = options.deployDc self.__zoneForTests = options.zone self.conf = conf + self.startMarvin() def options(self, parser, env): """ @@ -92,32 +86,20 @@ class MarvinPlugin(Plugin): parser.add_option("--marvin-config", action="store", default=env.get('MARVIN_CONFIG', './datacenter.cfg'), - dest="config_file", + dest="configFile", help="Marvin's configuration file is required." "The config file containing the datacenter and " "other management server " "information is specified") - parser.add_option("--deploy-dc", action="store_true", + parser.add_option("--deploy", 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="zone_tests", + parser.add_option("--zone", action="store_true", 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): @@ -127,17 +109,9 @@ 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 @@ -145,94 +119,125 @@ class MarvinPlugin(Plugin): Returns False or True based upon the result. ''' try: - __import__(filename) - return True + if os.path.isfile(filename): + ret = os.path.splitext(filename) + if ret[1] == ".py": + os.system("python "+ filename) + return True + return False except ImportError, e: - self.tcRunLogger.exception("Module : %s Import " - "Failed Reason :%s" - % (filename, GetDetailExceptionInfo(e))) + print "FileName :%s : Error : %s"%(filename,GetDetailExceptionInfo(e)) return False def wantFile(self, filename): ''' @Desc : Only python files will be used as test modules ''' - 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) + 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]) - self.tcRunLogger.name = test.__str__() - - def prepareTestRunner(self, runner): - return self.testRunner + self.__testName = test.__str__().split()[0] + self.__testClient.identifier = '-'.join([self.__identifier, self.__testName]) + if self.__tcRunLogger: + self.__tcRunLogger.name = test.__str__() def startTest(self, test): """ Currently used to record start time for tests Dump Start Msg of TestCase to Log """ - self.tcRunLogger.debug("\n\n::::::::::::STARTED : TC: " + - str(self.testName) + " :::::::::::") - self.startTime = time.time() + if self.__tcRunLogger: + 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. ''' - err_msg = GetDetailExceptionInfo(err) - self.tcRunLogger.fatal("%s: %s: %s" % - (EXCEPTION, self.testName, err_msg)) - self.testResult = EXCEPTION + if self.__tcRunLogger: + self.__tcRunLogger.fatal("%s: %s: %s" % + (EXCEPTION, self.__testName, GetDetailExceptionInfo(err))) + self.__testResult = EXCEPTION def handleFailure(self, test, err): ''' Adds Failing test cases and information to log. ''' - err_msg = GetDetailExceptionInfo(err) - self.tcRunLogger.fatal("%s: %s: %s" % - (FAILED, self.testName, err_msg)) - self.testResult = FAILED + if self.__tcRunLogger: + self.__tcRunLogger.fatal("%s: %s: %s" % + (FAILED, self.__testName, GetDetailExceptionInfo(err))) + self.__testResult = FAILED - def startMarvin(self, test_module_name): + def __getModName(self,inp, type='file'): ''' - 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 + @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 ''' try: obj_marvininit = MarvinInit(self.__configFile, - self.__loadNewApiFlag, self.__deployDcFlag, - 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) + 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) return SUCCESS - else: - return FAILED + print "\nMarvin Initialization Failed" + return FAILED except Exception, e: print "Exception Occurred under startMarvin: %s" % \ GetDetailExceptionInfo(e) @@ -243,28 +248,29 @@ class MarvinPlugin(Plugin): Currently used to record end time for tests """ endTime = time.time() - if self.startTime is not None: - totTime = int(endTime - self.startTime) - self.tcRunLogger.debug("TestCaseName: %s; Time Taken: " + if self.__startTime: + totTime = int(endTime - self.__startTime) + if self.__tcRunLogger: + 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 9b5bca2632e..c24477cb999 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 cloudstackException import ( +from marvin.cloudstackException import ( internalError, GetDetailExceptionInfo )