From c1d34369aa44e06be5909b823d73063f34be0f86 Mon Sep 17 00:00:00 2001 From: Girish Shilamkar Date: Wed, 12 Feb 2014 17:27:47 +0530 Subject: [PATCH] Revert "CLOUDSTACK-5674: Few fixes" This reverts commit e6b93b0a6824a3f2845fb42596c04b348ae147e2. --- setup/dev/advanced.cfg | 11 +- 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 | 41 +- tools/marvin/marvin/config/test_data.cfg | 864 +++++++++--------- tools/marvin/marvin/configGenerator.py | 54 +- tools/marvin/marvin/dbConnection.py | 2 +- tools/marvin/marvin/deployDataCenter.py | 3 +- tools/marvin/marvin/lib/utils.py | 2 +- tools/marvin/marvin/marvinInit.py | 118 +-- tools/marvin/marvin/marvinLog.py | 29 +- tools/marvin/marvin/marvinPlugin.py | 267 +++--- tools/marvin/marvin/sshClient.py | 2 +- 40 files changed, 745 insertions(+), 712 deletions(-) diff --git a/setup/dev/advanced.cfg b/setup/dev/advanced.cfg index 18dee31636b..15d10572b8b 100644 --- a/setup/dev/advanced.cfg +++ b/setup/dev/advanced.cfg @@ -218,5 +218,14 @@ "certCAPath": "NA", "certPath": "NA" } - ] + ], + "ApiLoadCfg": + { + "ParsedApiDestFolder": ".", + "ApiSpecFile": "/etc/cloud/cli/commands.xml" + }, + "TestData": + { + "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 4d05eafe0bb..e8c6ab24952 100644 --- a/tools/marvin/marvin/cloudstackTestClient.py +++ b/tools/marvin/marvin/cloudstackTestClient.py @@ -26,26 +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, @@ -133,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 @@ -200,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) @@ -232,9 +233,8 @@ class CSTestClient(object): providing their own configuration file as well. ''' self.__configObj = ConfigManager(self.__testDataFilePath) - if self.__configObj: + if self.__configObj is not None: self.__parsedTestDataConfig = self.__configObj.getConfig() - self.__logger.debug("Parsing Test data successful") else: self.__logger.error("createTestClient : Not able to create " "ConfigManager Object") @@ -246,14 +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 " @@ -375,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/config/test_data.cfg b/tools/marvin/marvin/config/test_data.cfg index 664f9162cae..e98d26f30ef 100644 --- a/tools/marvin/marvin/config/test_data.cfg +++ b/tools/marvin/marvin/config/test_data.cfg @@ -1,410 +1,454 @@ -{ - "region": { - "regionid": "2", - "regionname": "Region2", - "regionendpoint": "http://region2:8080/client" - }, - "zone": "NA", - - "domain": { "name": "domain" }, - - "project": { - "name": "Project", - "displaytext": "Test project" - }, - "account": { - "email": "test-account@test.com", - "firstname": "test", - "lastname": "test", - "username": "test-account", - "password": "password" - }, - "small": { - "displayname": "testserver", - "username": "root", - "password": "password", - "ssh_port": 22, - "hypervisor": "XenServer", - "privateport": 22, - "publicport": 22, - "protocol": 'TCP', - }, - "medium": { - "displayname": "testserver", - "username": "root", - "password": "password", - "ssh_port": 22, - "hypervisor": 'XenServer', - "privateport": 22, - "publicport": 22, - "protocol": 'TCP', - }, - "service_offerings": { - "name": "Tiny Instance", - "displaytext": "Tiny Instance", - "cpunumber": 1, - "cpuspeed": 100, - "memory": 128, - - "tiny": { - "name": "Tiny Instance", - "displaytext": "Tiny Instance", - "cpunumber": 1, - "cpuspeed": 100, - "memory": 128, - }, - "small": { - "name": "Small Instance", - "displaytext": "Small Instance", - "cpunumber": 1, - "cpuspeed": 100, - "memory": 256 - }, - "medium": { - "name": "Medium Instance", - "displaytext": "Medium Instance", - "cpunumber": 1, - "cpuspeed": 100, - "memory": 256, - }, - "big": { - "name": "BigInstance", - "displaytext": "BigInstance", - "cpunumber": 1, - "cpuspeed": 100, - "memory": 512, - } - }, - "disk_offering": { - "name": "Disk offering", - "displaytext": "Disk offering", - "disksize": 1 - }, - 'resized_disk_offering': { - "displaytext": "Resized", - "name": "Resized", - "disksize": 3 - }, - "network": { - "name": "Test Network", - "displaytext": "Test Network", - "acltype": "Account", - }, - "network2": { - "name": "Test Network Shared", - "displaytext": "Test Network Shared", - "vlan" :1201, - "gateway" :"172.16.15.1", - "netmask" :"255.255.255.0", - "startip" :"172.16.15.21", - "endip" :"172.16.15.41", - "acltype": "Account", - }, - "network_offering": { - "name": 'Test Network offering', - "displaytext": 'Test Network offering', - "guestiptype": 'Isolated', - "supportedservices": 'Dhcp,Dns,SourceNat,PortForwarding', - "traffictype": 'GUEST', - "availability": 'Optional', - "serviceProviderList" : { - "Dhcp": 'VirtualRouter', - "Dns": 'VirtualRouter', - "SourceNat": 'VirtualRouter', - "PortForwarding": 'VirtualRouter', - }, - }, - "isolated_network_offering": { - "name": "Network offering-DA services", - "displaytext": "Network offering-DA services", - "guestiptype": "Isolated", - "supportedservices": "Dhcp,Dns,SourceNat,PortForwarding,Vpn,Firewall,Lb,UserData,StaticNat", - "traffictype": "GUEST", - "availability": "Optional'", - "serviceProviderList": { - "Dhcp": "VirtualRouter", - "Dns": "VirtualRouter", - "SourceNat": "VirtualRouter", - "PortForwarding": "VirtualRouter", - "Vpn": "VirtualRouter", - "Firewall": "VirtualRouter", - "Lb": "VirtualRouter", - "UserData": "VirtualRouter", - "StaticNat": "VirtualRouter" - } - }, - "isolated_network": { - "name": "Isolated Network", - "displaytext": "Isolated Network" - }, - "virtual_machine": { - "displayname": "Test VM", - "username": "root", - "password": "password", - "ssh_port": 22, - "privateport": 22, - "publicport": 22, - "protocol": "TCP", - "affinity": { - "name": "webvms", - "type": "host anti-affinity", - }, - }, - "server_without_disk": { - "displayname": "Test VM-No Disk", - "username": "root", - "password": "password", - "ssh_port": 22, - "hypervisor": 'XenServer', - "privateport": 22, - "publicport": 22, - "protocol": 'TCP', - }, - "shared_network": { - "name": "MySharedNetwork - Test", - "displaytext": "MySharedNetwork", - "vlan" : "", - "gateway" :"", - "netmask" :"", - "startip" :"", - "endip" :"", - "acltype" : "Domain", - "scope":"all" - }, - "shared_network_offering_sg": { - "name": "MySharedOffering-sg", - "displaytext": "MySharedOffering-sg", - "guestiptype": "Shared", - "supportedservices": "Dhcp,Dns,UserData,SecurityGroup", - "specifyVlan" : "False", - "specifyIpRanges" : "False", - "traffictype": "GUEST", - "serviceProviderList" : { - "Dhcp": "VirtualRouter", - "Dns": "VirtualRouter", - "UserData": "VirtualRouter", - "SecurityGroup": "SecurityGroupProvider" - } - }, - "shared_network_sg": { - "name": "Shared-Network-SG-Test", - "displaytext": "Shared-Network_SG-Test", - "networkofferingid":"1", - "vlan" : "", - "gateway" :"", - "netmask" :"255.255.255.0", - "startip" :"", - "endip" :"", - "acltype" : "Domain", - "scope":"all" - }, - "vpc_offering": { - "name": "VPC off", - "displaytext": "VPC off", - "supportedservices": "Dhcp,Dns,SourceNat,PortForwarding,Vpn,Lb,UserData,StaticNat,NetworkACL" - }, - "vpc": { - "name": "TestVPC", - "displaytext": "TestVPC", - "cidr": "10.0.0.1/24" - }, - "clusters": { - 0: { - "clustername": "Xen Cluster", - "clustertype": "CloudManaged", - "hypervisor": "XenServer", - }, - 1: { - "clustername": "KVM Cluster", - "clustertype": "CloudManaged", - "hypervisor": "KVM", - }, - 2: { - "hypervisor": 'VMware', - "clustertype": 'ExternalManaged', - "username": 'administrator', - "password": 'fr3sca', - "url": 'http://192.168.100.17/CloudStack-Clogeny-Pune/Pune-1', - "clustername": 'VMWare Cluster', - }, - }, - "hosts": { - "xenserver": { - "hypervisor": 'XenServer', - "clustertype": 'CloudManaged', - "url": 'http://192.168.100.211', - "username": "root", - "password": "fr3sca", - }, - "kvm": { - "hypervisor": 'KVM', - "clustertype": 'CloudManaged', - "url": 'http://192.168.100.212', - "username": "root", - "password": "fr3sca", - }, - "vmware": { - "hypervisor": 'VMware', - "clustertype": 'ExternalManaged', - "url": 'http://192.168.100.203', - "username": "administrator", - "password": "fr3sca", - }, - }, - "network_offering_shared": { - "name": 'Test Network offering shared', - "displaytext": 'Test Network offering Shared', - "guestiptype": 'Shared', - "supportedservices": 'Dhcp,Dns,UserData', - "traffictype": 'GUEST', - "specifyVlan" : "True", - "specifyIpRanges" : "True", - "serviceProviderList" : { - "Dhcp": 'VirtualRouter', - "Dns": 'VirtualRouter', - "UserData": 'VirtualRouter', - }, - }, - "network_offering_internal_lb": { - "name": "Network offering for internal lb service", - "displaytext": "Network offering for internal lb service", - "guestiptype": "Isolated", - "traffictype": "Guest", - "supportedservices": "Vpn,Dhcp,Dns,Lb,UserData,SourceNat,StaticNat,PortForwarding,NetworkACL", - "serviceProviderList": { - "Dhcp": "VpcVirtualRouter", - "Dns": "VpcVirtualRouter", - "Vpn": "VpcVirtualRouter", - "UserData": "VpcVirtualRouter", - "Lb": "InternalLbVM", - "SourceNat": "VpcVirtualRouter", - "StaticNat": "VpcVirtualRouter", - "PortForwarding": "VpcVirtualRouter", - "NetworkACL": "VpcVirtualRouter", - }, - "serviceCapabilityList": { - "SourceNat": {"SupportedSourceNatTypes": "peraccount"}, - "Lb": {"lbSchemes": "internal", "SupportedLbIsolation": "dedicated"} - } - }, - - "natrule": { - "privateport": 22, - "publicport": 2222, - "protocol": "TCP" - }, - "lbrule": { - "name": "SSH", - "alg": "roundrobin", - "privateport": 22, - "publicport": 2222, - "protocol": 'TCP' - }, - - "iso1": { - "displaytext": "Test ISO 1", - "name": "ISO 1", - "url": "http://people.apache.org/~tsp/dummy.iso", - "isextractable": True, - "isfeatured": True, - "ispublic": True, - "ostype": "CentOS 5.3 (64-bit)", - }, - "iso2": { - "displaytext": "Test ISO 2", - "name": "ISO 2", - "url": "http://people.apache.org/~tsp/dummy.iso", - "isextractable": True, - "isfeatured": True, - "ispublic": True, - "ostype": "CentOS 5.3 (64-bit)", - "mode": 'HTTP_DOWNLOAD', - }, - "isfeatured": True, - "ispublic": True, - "isextractable": True, - "bootable": True, - "passwordenabled": True, - - "template": { - "displaytext": "xs", - "name": "xs", - "passwordenabled": False, - }, - "template_2": { - "displaytext": "Public Template", - "name": "Public template", - "ostype": "CentOS 5.3 (64-bit)", - "isfeatured": True, - "ispublic": True, - "isextractable": True, - "mode": "HTTP_DOWNLOAD", - }, - "templatefilter": 'self', - - "security_group" : { "name": "custom_Sec_Grp" }, - "ingress_rule": { - "protocol": "TCP", - "startport": "22", - "endport": "22", - "cidrlist": "0.0.0.0/0" - }, - "ostype": "CentOS 5.3 (64-bit)", - "sleep": 90, - "timeout": 10, - "advanced_sg": { - "zone": { - "name": "", - "dns1": "8.8.8.8", - "internaldns1": "192.168.100.1", - "networktype": "Advanced", - "securitygroupenabled": "true" - }, - "securitygroupenabled": "true" - }, - "vlan": { - "part": ["4090-4091", "4092-4095"], - "full": "4090-4095", - }, - "nfs": { - "url": "nfs://10.147.28.7/export/home/talluri/testprimary", - "name": "Primary XEN" - }, - "iscsi": { - "url": "iscsi://192.168.100.21/iqn.2012-01.localdomain.clo-cstack-cos6:iser/1", - "name": "Primary iSCSI" - }, - "volume": {"diskname": "Test Volume"}, - "volume_offerings": { - 0: {"diskname": "TestDiskServ"}, - }, - "diskdevice": ['/dev/vdc', '/dev/vdb', '/dev/hdb', '/dev/hdc', '/dev/xvdd', '/dev/cdrom', '/dev/sr0', '/dev/cdrom1' ], - - #test_vpc_vpn.py - "vpn_user": { - "username": "test", - "password": "password", - }, - "vpc": { - "name": "vpc_vpn", - "displaytext": "vpc-vpn", - "cidr": "10.1.1.0/24" - }, - "ntwk": { - "name": "tier1", - "displaytext": "vpc-tier1", - "gateway" : "10.1.1.1", - "netmask" : "255.255.255.192" - }, - "vpc2": { - "name": "vpc2_vpn", - "displaytext": "vpc2-vpn", - "cidr": "10.2.1.0/24" - }, - "ntwk2": { - "name": "tier2", - "displaytext": "vpc-tier2", - "gateway" : "10.2.1.1", - "netmask" : "255.255.255.192" - } -} +# 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. +# +# Use the common configs added such as account, network_offerings, domain, project, +# or add your own data if required separately for any test case +{ + "region": { + "regionid": "2", + "regionname": "Region2", + "regionendpoint": "http://region2:8080/client" + }, + "zone": "NA", + + "domain": { "name": "domain" }, + + "project": { + "name": "Project", + "displaytext": "Test project" + }, + "account": { + "email": "test-account@test.com", + "firstname": "test", + "lastname": "test", + "username": "test-account", + "password": "password" + }, + "small": { + # Create a small virtual machine instance with disk offering + "displayname": "testserver", + "username": "root", # VM creds for SSH + "password": "password", + "ssh_port": 22, + "hypervisor": 'XenServer', + "privateport": 22, + "publicport": 22, + "protocol": 'TCP', + }, + "medium": { + # Create a medium virtual machine instance + "displayname": "testserver", + "username": "root", + "password": "password", + "ssh_port": 22, + "hypervisor": 'XenServer', + "privateport": 22, + "publicport": 22, + "protocol": 'TCP', + }, + "service_offerings": { + "name": "Tiny Instance", + "displaytext": "Tiny Instance", + "cpunumber": 1, + "cpuspeed": 100, + "memory": 128, + + "tiny": { + "name": "Tiny Instance", + "displaytext": "Tiny Instance", + "cpunumber": 1, + "cpuspeed": 100, # in MHz + "memory": 128, # In MBs + }, + "small": { + "name": "Small Instance", + "displaytext": "Small Instance", + "cpunumber": 1, + "cpuspeed": 100, + "memory": 256 + }, + "medium": { + "name": "Medium Instance", + "displaytext": "Medium Instance", + "cpunumber": 1, + "cpuspeed": 100, + "memory": 256, + }, + "big": { + "name": "BigInstance", + "displaytext": "BigInstance", + "cpunumber": 1, + "cpuspeed": 100, + "memory": 512, + } + }, + "disk_offering": { + "name": "Disk offering", + "displaytext": "Disk offering", + "disksize": 1 # in GB + }, + 'resized_disk_offering': { + "displaytext": "Resized", + "name": "Resized", + "disksize": 3 + }, + "network": { + "name": "Test Network", + "displaytext": "Test Network", + acltype": "Account", + }, + "network2": { + "name": "Test Network Shared", + "displaytext": "Test Network Shared", + "vlan" :1201, + "gateway" :"172.16.15.1", + "netmask" :"255.255.255.0", + "startip" :"172.16.15.21", + "endip" :"172.16.15.41", + "acltype": "Account", + }, + "network_offering": { + "name": 'Test Network offering', + "displaytext": 'Test Network offering', + "guestiptype": 'Isolated', + "supportedservices": 'Dhcp,Dns,SourceNat,PortForwarding', + "traffictype": 'GUEST', + "availability": 'Optional', + "serviceProviderList" : { + "Dhcp": 'VirtualRouter', + "Dns": 'VirtualRouter', + "SourceNat": 'VirtualRouter', + "PortForwarding": 'VirtualRouter', + }, + }, + "isolated_network_offering": { + "name": "Network offering-DA services", + "displaytext": "Network offering-DA services", + "guestiptype": "Isolated", + "supportedservices": "Dhcp,Dns,SourceNat,PortForwarding,Vpn,Firewall,Lb,UserData,StaticNat", + "traffictype": "GUEST", + "availability": "Optional'", + "serviceProviderList": { + "Dhcp": "VirtualRouter", + "Dns": "VirtualRouter", + "SourceNat": "VirtualRouter", + "PortForwarding": "VirtualRouter", + "Vpn": "VirtualRouter", + "Firewall": "VirtualRouter", + "Lb": "VirtualRouter", + "UserData": "VirtualRouter", + "StaticNat": "VirtualRouter" + } + }, + "isolated_network": { + "name": "Isolated Network", + "displaytext": "Isolated Network" + }, + "virtual_machine": { + "displayname": "Test VM", + "username": "root", + "password": "password", + "ssh_port": 22, + "privateport": 22, + "publicport": 22, + "protocol": "TCP", + "affinity": { + "name": "webvms", + "type": "host anti-affinity", + }, + }, + "server_without_disk": { + "displayname": "Test VM-No Disk", + "username": "root", + "password": "password", + "ssh_port": 22, + "hypervisor": 'XenServer', + "privateport": 22, + # For NAT rule creation + "publicport": 22, + "protocol": 'TCP', + }, + "shared_network": { + "name": "MySharedNetwork - Test", + "displaytext": "MySharedNetwork", + "vlan" : "", + "gateway" :"", + "netmask" :"", + "startip" :"", + "endip" :"", + "acltype" : "Domain", + "scope":"all" + }, + "shared_network_offering_sg": { + "name": "MySharedOffering-sg", + "displaytext": "MySharedOffering-sg", + "guestiptype": "Shared", + "supportedservices": "Dhcp,Dns,UserData,SecurityGroup", + "specifyVlan" : "False", + "specifyIpRanges" : "False", + "traffictype": "GUEST", + "serviceProviderList" : { + "Dhcp": "VirtualRouter", + "Dns": "VirtualRouter", + "UserData": "VirtualRouter", + "SecurityGroup": "SecurityGroupProvider" + } + }, + "shared_network_sg": { + "name": "Shared-Network-SG-Test", + "displaytext": "Shared-Network_SG-Test", + "networkofferingid":"1", + "vlan" : "", + "gateway" :"", + "netmask" :"255.255.255.0", + "startip" :"", + "endip" :"", + "acltype" : "Domain", + "scope":"all" + }, + "vpc_offering": { + "name": "VPC off", + "displaytext": "VPC off", + "supportedservices": "Dhcp,Dns,SourceNat,PortForwarding,Vpn,Lb,UserData,StaticNat,NetworkACL" + }, + "vpc": { + "name": "TestVPC", + "displaytext": "TestVPC", + "cidr": "10.0.0.1/24" + }, + "clusters": { + 0: { + "clustername": "Xen Cluster", + "clustertype": "CloudManaged", + # CloudManaged or ExternalManaged" + "hypervisor": "XenServer", + # Hypervisor type + }, + 1: { + "clustername": "KVM Cluster", + "clustertype": "CloudManaged", + # CloudManaged or ExternalManaged" + "hypervisor": "KVM", + # Hypervisor type + }, + 2: { + "hypervisor": 'VMware', + # Hypervisor type + "clustertype": 'ExternalManaged', + # CloudManaged or ExternalManaged" + "username": 'administrator', + "password": 'fr3sca', + "url": 'http://192.168.100.17/CloudStack-Clogeny-Pune/Pune-1', + # Format:http://vCenter Host/Datacenter/Cluster + "clustername": 'VMWare Cluster', + }, + }, + "hosts": { + "xenserver": { + # Must be name of corresponding Hypervisor type + # in cluster in small letters + "hypervisor": 'XenServer', + # Hypervisor type + "clustertype": 'CloudManaged', + # CloudManaged or ExternalManaged" + "url": 'http://192.168.100.211', + "username": "root", + "password": "fr3sca", + }, + "kvm": { + "hypervisor": 'KVM', + # Hypervisor type + "clustertype": 'CloudManaged', + # CloudManaged or ExternalManaged" + "url": 'http://192.168.100.212', + "username": "root", + "password": "fr3sca", + }, + "vmware": { + "hypervisor": 'VMware', + # Hypervisor type + "clustertype": 'ExternalManaged', + # CloudManaged or ExternalManaged" + "url": 'http://192.168.100.203', + "username": "administrator", + "password": "fr3sca", + }, + }, + "network_offering_shared": { + "name": 'Test Network offering shared', + "displaytext": 'Test Network offering Shared', + "guestiptype": 'Shared', + "supportedservices": 'Dhcp,Dns,UserData', + "traffictype": 'GUEST', + "specifyVlan" : "True", + "specifyIpRanges" : "True", + "serviceProviderList" : { + "Dhcp": 'VirtualRouter', + "Dns": 'VirtualRouter', + "UserData": 'VirtualRouter', + }, + }, + "network_offering_internal_lb": { + "name": "Network offering for internal lb service", + "displaytext": "Network offering for internal lb service", + "guestiptype": "Isolated", + "traffictype": "Guest", + "supportedservices": "Vpn,Dhcp,Dns,Lb,UserData,SourceNat,StaticNat,PortForwarding,NetworkACL", + "serviceProviderList": { + "Dhcp": "VpcVirtualRouter", + "Dns": "VpcVirtualRouter", + "Vpn": "VpcVirtualRouter", + "UserData": "VpcVirtualRouter", + "Lb": "InternalLbVM", + "SourceNat": "VpcVirtualRouter", + "StaticNat": "VpcVirtualRouter", + "PortForwarding": "VpcVirtualRouter", + "NetworkACL": "VpcVirtualRouter", + }, + "serviceCapabilityList": { + "SourceNat": {"SupportedSourceNatTypes": "peraccount"}, + "Lb": {"lbSchemes": "internal", "SupportedLbIsolation": "dedicated"} + } + }, + + "natrule": { + "privateport": 22, + "publicport": 2222, + "protocol": "TCP" + }, + "lbrule": { + "name": "SSH", + "alg": "roundrobin", + # Algorithm used for load balancing + "privateport": 22, + "publicport": 2222, + "protocol": 'TCP' + }, + + # ISO related test data + "iso1": { + "displaytext": "Test ISO 1", + "name": "ISO 1", + "url": "http://people.apache.org/~tsp/dummy.iso", + # Source URL where ISO is located + "isextractable": True, + "isfeatured": True, + "ispublic": True, + "ostype": "CentOS 5.3 (64-bit)", + }, + "iso2": { + "displaytext": "Test ISO 2", + "name": "ISO 2", + "url": "http://people.apache.org/~tsp/dummy.iso", + # Source URL where ISO is located + "isextractable": True, + "isfeatured": True, + "ispublic": True, + "ostype": "CentOS 5.3 (64-bit)", + "mode": 'HTTP_DOWNLOAD', + # Used in Extract template, value must be HTTP_DOWNLOAD + }, + "isfeatured": True, + "ispublic": True, + "isextractable": True, + "bootable": True, # For edit template + "passwordenabled": True, + + "template": { + "displaytext": "xs", + "name": "xs", + "passwordenabled": False, + }, + "template_2": { + "displaytext": "Public Template", + "name": "Public template", + "ostype": "CentOS 5.3 (64-bit)", + "isfeatured": True, + "ispublic": True, + "isextractable": True, + "mode": "HTTP_DOWNLOAD", + }, + "templatefilter": 'self', + + "security_group" : { "name": "custom_Sec_Grp" }, + "ingress_rule": { + "protocol": "TCP", + startport": "22", + "endport": "22", + "cidrlist": "0.0.0.0/0" + }, + "ostype": "CentOS 5.3 (64-bit)", + "sleep": 90, + "timeout": 10, + "advanced_sg": { + "zone": { + "name": "", + "dns1": "8.8.8.8", + "internaldns1": "192.168.100.1", + "networktype": "Advanced", + "securitygroupenabled": "true" + }, + "securitygroupenabled": "true" + }, + "vlan": { + "part": ["4090-4091", "4092-4095"], + "full": "4090-4095", + }, + nfs": { + "url": "nfs://10.147.28.7/export/home/talluri/testprimary", + # Format: File_System_Type/Location/Path + "name": "Primary XEN" + }, + "iscsi": { + "url": "iscsi://192.168.100.21/iqn.2012-01.localdomain.clo-cstack-cos6:iser/1", + # Format : iscsi://IP Address/IQN number/LUN# + "name": "Primary iSCSI" + }, + "volume": {"diskname": "Test Volume"}, + "volume_offerings": { + 0: {"diskname": "TestDiskServ"}, + }, + "diskdevice": ['/dev/vdc', '/dev/vdb', '/dev/hdb', '/dev/hdc', '/dev/xvdd', '/dev/cdrom', '/dev/sr0', '/dev/cdrom1' ], + + #test_vpc_vpn.py + "vpn_user": { + "username": "test", + "password": "password", + }, + "vpc": { + "name": "vpc_vpn", + "displaytext": "vpc-vpn", + "cidr": "10.1.1.0/24" + }, + "ntwk": { + "name": "tier1", + "displaytext": "vpc-tier1", + "gateway" : "10.1.1.1", + "netmask" : "255.255.255.192" + }, + "vpc2": { + "name": "vpc2_vpn", + "displaytext": "vpc2-vpn", + "cidr": "10.2.1.0/24" + }, + "ntwk2": { + "name": "tier2", + "displaytext": "vpc-tier2", + "gateway" : "10.2.1.1", + "netmask" : "255.255.255.192" + } +} diff --git a/tools/marvin/marvin/configGenerator.py b/tools/marvin/marvin/configGenerator.py index fefd427415d..245473a188e 100644 --- a/tools/marvin/marvin/configGenerator.py +++ b/tools/marvin/marvin/configGenerator.py @@ -20,7 +20,6 @@ import os from optparse import OptionParser import jsonHelper from marvin.codes import * -from marvin.cloudstackException import GetDetailExceptionInfo class managementServer(object): @@ -54,6 +53,12 @@ class logger(object): self.LogFolderPath = None +class apiLoadCfg(object): + def __init__(self): + self.ParsedApiDestFolder = None + self.ApiSpecFile = None + + class cloudstackConfiguration(object): def __init__(self): self.zones = [] @@ -61,7 +66,6 @@ class cloudstackConfiguration(object): self.dbSvr = None self.globalConfig = [] self.logger = [] - self.TestData = None class zone(object): @@ -328,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 @@ -336,10 +343,8 @@ class ConfigManager(object): self.__setConfig() def __setConfig(self): - if not self.__verifyFile(): - dirPath = os.path.dirname(__file__) - self.__filePath = str(os.path.join(dirPath, "config/test_data.cfg")) - self.__parsedCfgDict = self.__parseConfig() + if self.__verifyFile() is not False: + self.__parsedCfgDict = self.__parseConfig() def __parseConfig(self): ''' @@ -353,18 +358,16 @@ class ConfigManager(object): config_dict = None try: configlines = [] - count = 0 - with open(self.__filePath, 'r') as fp: + with open(file, 'r') as fp: for line in fp: - print "line number",count+1 if len(line) != 0: ws = line.strip() - if not ws.startswith("#"): + if ws[0] not in ["#"]: configlines.append(ws) config_dict = json.loads("\n".join(configlines)) except Exception, e: #Will replace with log once we have logging done - print "\n Exception occurred under ConfigManager:__parseConfig :%s", GetDetailExceptionInfo(e) + print "\n Exception occurred under __parseConfig", e finally: return config_dict @@ -379,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): ''' @@ -891,19 +894,18 @@ def generate_setup_config(config, file=None): def getSetupConfig(file): - #try: - config = cloudstackConfiguration() - configLines = [] - with open(file, 'r') as fp: - for line in fp: - ws = line.strip() - if not ws.startswith("#"): - configLines.append(ws) - config = json.loads("\n".join(configLines)) - return jsonHelper.jsonLoader(config) - #except Exception, e: - # print "\nException Occurred under getSetupConfig %s" %\ - # GetDetailExceptionInfo(e) + if not os.path.exists(file): + raise IOError("config file %s not found. \ + please specify a valid config file" % file) + config = cloudstackConfiguration() + configLines = [] + with open(file, 'r') as fp: + for line in fp: + ws = line.strip() + if not ws.startswith("#"): + configLines.append(ws) + config = json.loads("\n".join(configLines)) + return jsonHelper.jsonLoader(config) if __name__ == "__main__": parser = OptionParser() 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 b0894b9c814..862a1bfd3ee 100644 --- a/tools/marvin/marvin/deployDataCenter.py +++ b/tools/marvin/marvin/deployDataCenter.py @@ -682,12 +682,11 @@ if __name__ == "__main__": Step1 : Parse and Create the config from input config provided ''' cfg = configGenerator.getSetupConfig(options.input) - print "\n***********CONFIG*******",cfg log_obj = MarvinLog("CSLog") 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 40b1aeff2f0..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 ''' -import marvin + from marvin import configGenerator +from marvin import cloudstackException from marvin.marvinLog import MarvinLog from marvin.deployDataCenter import DeployDataCenters from marvin.cloudstackTestClient import CSTestClient @@ -44,35 +45,34 @@ import logging import string import random from sys import exit +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 - self.__parsedConfig = None def __parseConfig(self): ''' - @Name: __parseConfig @Desc : Parses the configuration file passed and assigns the parsed configuration - @Output : SUCCESS or FAILED ''' try: - if not os.path.isfile(self.__configFile): + if self.__configFile is None: return FAILED - print "*********SETUP**********",type(configGenerator.getSetupConfig(self.__configFile)) self.__parsedConfig = configGenerator.\ getSetupConfig(self.__configFile) return SUCCESS @@ -93,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") @@ -114,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 @@ -131,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 @@ -141,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, - self.__parsedConfig.logger) + 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) @@ -164,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] @@ -174,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 @@ -183,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)): @@ -200,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, - self.__parsedConfig, - self.__tcRunLogger) - ret = deploy_obj.deploy() - if ret == SUCCESS: - print "Deploy DC Successful" - else: - print "Deploy DC Failed" - return ret + ''' + Deploy the DataCenter and retrieves test client. + ''' + deploy_obj = DeployDataCenters(self.__testClient, + self.__parsedConfig, + self.__tcRunLogger) + 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 80120c9b6ab..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,16 +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: @@ -155,6 +155,7 @@ class MarvinLog: print "\n*********Log Folder Path: %s. " \ "All logs will be available here **************" \ % str(self.__logFolderDir) + os.makedirs(self.__logFolderDir) ''' diff --git a/tools/marvin/marvin/marvinPlugin.py b/tools/marvin/marvin/marvinPlugin.py index 3a9740432c6..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 -from sys import stdout, exit +import sys import logging -import time -import os import nose.core from marvin.cloudstackTestCase import cloudstackTestCase from marvin.marvinInit import MarvinInit @@ -27,6 +26,8 @@ from marvin.codes import (SUCCESS, FAILED, EXCEPTION) 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 = 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,13 +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 - if self.startMarvin() == FAILED: - print "\nExiting Marvin. Please Check" - exit(1) def options(self, parser, env): """ @@ -88,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): @@ -111,149 +127,112 @@ 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 run the available test module for any Import - Errors before running and check + @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 getting imported. 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 - - def prepareTestRunner(self, runner): - if self.__testRunner: - return self.__testRunner + 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) is 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: - print "\nMarvin Initialization Successful." \ - "Test Suite:%s" % str(test_suite) - 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) - return SUCCESS - return FAILED - 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: - if self.__deployDcFlag: - print "\nStep1 :Deploy Flag is Enabled, will deployDC" - obj_marvininit = MarvinInit(self.__configFile, - self.__deployDcFlag, - "DeployDc", - self.__zoneForTests) - if not obj_marvininit or obj_marvininit.init() != SUCCESS: - return FAILED - print "\nStep2: Now Start Running Test Suites" - for suites in self.conf.testNames: - if os.path.isdir(suites): - self.__runSuites(suites) - if os.path.isfile(suites): - self.__runSuite(suites) - return SUCCESS + 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) + return SUCCESS + else: + return FAILED except Exception, e: print "Exception Occurred under startMarvin: %s" % \ GetDetailExceptionInfo(e) @@ -264,30 +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: %s Seconds; StartTime: %s; " - "EndTime: %s; Result: %s" % - (self.__testName, str(totTime), - str(time.ctime(self.__startTime)), - str(time.ctime(endTime)), - self.__testResult)) + 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)), + str(time.ctime(endTime)), + 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, - test.DomainName, - test.AcctType) + 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 )