You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by gi...@apache.org on 2014/05/06 12:00:41 UTC
[07/32] Marvin + test changes from master Signed-off-by:
SrikanteswaraRao Talluri
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/404ac549/tools/marvin/marvin/configGenerator.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/configGenerator.py b/tools/marvin/marvin/configGenerator.py
index 0b4a0a1..68ec24e 100644
--- a/tools/marvin/marvin/configGenerator.py
+++ b/tools/marvin/marvin/configGenerator.py
@@ -20,9 +20,12 @@ import os
from optparse import OptionParser
import jsonHelper
from marvin.codes import *
+from marvin.cloudstackException import GetDetailExceptionInfo
+from marvin.config.test_data import test_data
class managementServer(object):
+
def __init__(self):
self.mgtSvrIp = None
self.port = 8096
@@ -34,6 +37,7 @@ class managementServer(object):
class dbServer(object):
+
def __init__(self):
self.dbSvr = None
self.port = 3306
@@ -50,8 +54,7 @@ class configuration(object):
class logger(object):
def __init__(self):
- '''TestCase/TestClient'''
- self.logFolderPath = None
+ self.LogFolderPath = None
class cloudstackConfiguration(object):
@@ -61,6 +64,7 @@ class cloudstackConfiguration(object):
self.dbSvr = None
self.globalConfig = []
self.logger = None
+ self.TestData = None
class zone(object):
@@ -83,6 +87,7 @@ class zone(object):
class trafficType(object):
+
def __init__(self, typ, labeldict=None):
self.typ = typ # Guest/Management/Public
if labeldict:
@@ -95,6 +100,7 @@ class trafficType(object):
class pod(object):
+
def __init__(self):
self.gateway = None
self.name = None
@@ -109,6 +115,7 @@ class pod(object):
class VmwareDc(object):
+
def __init__(self):
self.zoneid = None
self.name = None
@@ -118,6 +125,7 @@ class VmwareDc(object):
class cluster(object):
+
def __init__(self):
self.clustername = None
self.clustertype = None
@@ -132,6 +140,7 @@ class cluster(object):
class host(object):
+
def __init__(self):
self.hypervisor = None
self.password = None
@@ -149,6 +158,7 @@ class host(object):
class physicalNetwork(object):
+
def __init__(self):
self.name = None
self.tags = []
@@ -163,6 +173,7 @@ class physicalNetwork(object):
class provider(object):
+
def __init__(self, name=None):
self.name = name
self.state = None
@@ -173,6 +184,7 @@ class provider(object):
class network(object):
+
def __init__(self):
self.displaytext = None
self.name = None
@@ -185,6 +197,7 @@ class network(object):
class iprange(object):
+
def __init__(self):
'''tagged/untagged'''
self.gateway = None
@@ -198,12 +211,14 @@ class iprange(object):
class primaryStorage(object):
+
def __init__(self):
self.name = None
self.url = None
class secondaryStorage(object):
+
def __init__(self):
self.url = None
self.provider = None
@@ -211,6 +226,7 @@ class secondaryStorage(object):
class cacheStorage(object):
+
def __init__(self):
self.url = None
self.provider = None
@@ -218,6 +234,7 @@ class cacheStorage(object):
class s3(object):
+
def __init__(self):
self.accesskey = None
self.secretkey = None
@@ -230,6 +247,7 @@ class s3(object):
class netscaler(object):
+
def __init__(self, hostname=None, username='nsroot', password='nsroot'):
self.hostname = hostname
self.username = username
@@ -246,11 +264,12 @@ class netscaler(object):
def __repr__(self):
req = zip(self.__dict__.keys(), self.__dict__.values())
- return self.hostname+"?" + "&".join(["=".join([r[0], r[1]])
- for r in req])
+ return self.hostname + "?" + "&".join(["=".join([r[0], r[1]])
+ for r in req])
class srx(object):
+
def __init__(self, hostname=None, username='root', password='admin'):
self.hostname = hostname
self.username = username
@@ -269,11 +288,12 @@ class srx(object):
def __repr__(self):
req = zip(self.__dict__.keys(), self.__dict__.values())
- return self.hostname+"?" + "&".join(["=".join([r[0], r[1]])
- for r in req])
+ return self.hostname + "?" + "&".join(["=".join([r[0], r[1]])
+ for r in req])
class bigip(object):
+
def __init__(self, hostname=None, username='root', password='default'):
self.hostname = hostname
self.username = username
@@ -290,14 +310,14 @@ class bigip(object):
def __repr__(self):
req = zip(self.__dict__.keys(), self.__dict__.values())
- return self.hostname+"?" + "&".join(["=".join([r[0], r[1]])
- for r in req])
+ return self.hostname + "?" + "&".join(["=".join([r[0], r[1]])
+ for r in req])
class ConfigManager(object):
'''
- @Name: configManager
+ @Name: ConfigManager
@Desc: 1. It provides the basic configuration facilities to marvin.
2. User can just add configuration files for his tests, deployment
etc, under one config folder before running their tests.
@@ -328,16 +348,21 @@ class ConfigManager(object):
"getConfig" API,once configObj is returned.
'''
- def __init__(self):
- # Joining path with current directory will avoid relative path issue
- # It will take correct path irrespective of from where the test case is run
- dirPath = os.path.dirname(__file__)
- self.filePath = os.path.join(dirPath, 'config/config.cfg')
- self.parsedDict = None
- if self.__verifyFile(self.filePath) is not False:
- self.parsedDict = self.__parseConfig(self.filePath)
-
- def __parseConfig(self, file):
+ def __init__(self, cfg_file=None):
+ self.__filePath = cfg_file
+ self.__parsedCfgDict = None
+ '''
+ Set the Configuration
+ '''
+ self.__setConfig()
+
+ def __setConfig(self):
+ if not self.__verifyFile():
+ dirPath = os.path.dirname(__file__)
+ self.__filePath = str(os.path.join(dirPath, "config/test_data.py"))
+ self.__parsedCfgDict = self.__parseConfig()
+
+ def __parseConfig(self):
'''
@Name : __parseConfig
@Description: Parses the Input configuration Json file
@@ -348,36 +373,38 @@ class ConfigManager(object):
'''
config_dict = None
try:
- configlines = []
- with open(file, 'r') as fp:
- for line in fp:
- if len(line) != 0:
+ if self.__filePath.endswith(".py"):
+ config_dict = test_data
+ else:
+ configLines = []
+ with open(file, 'r') as fp:
+ for line in fp:
ws = line.strip()
- 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 __parseConfig", e
+ if not ws.startswith("#"):
+ configLines.append(ws)
+ config = json.loads("\n".join(configLines))
+ config_dict = config
+ except Exception as e:
+ # Will replace with log once we have logging done
+ print "\n Exception occurred under ConfigManager:__parseConfig" \
+ " :%s", GetDetailExceptionInfo(e)
finally:
return config_dict
- def __verifyFile(self, file):
+ def __verifyFile(self):
'''
@Name : __parseConfig
@Description: Parses the Input configuration Json file
and returns a dictionary from the file.
- @Input : file NA
+ @Input : NA
@Output : True or False based upon file input validity
and availability
'''
- if file is None or file == '':
+ if self.__filePath is None or self.__filePath == '':
return False
- if os.path.exists(file) is False:
- return False
- return True
+ return os.path.exists(self.__filePath)
- def __getSectionData(self, return_dict, section=None):
+ def getSectionData(self, section=None):
'''
@Name: getSectionData
@Desc: Gets the Section data of a particular section
@@ -386,43 +413,29 @@ class ConfigManager(object):
section to be returned from this dict
@Output:Section matching inside the parsed data
'''
- if return_dict is not None:
- inp = return_dict
- elif self.parsedDict is None:
+ if self.__parsedCfgDict is None or section is None:
+ print "\nEither Parsed Dictionary is None or Section is None"
return INVALID_INPUT
- else:
- inp = self.parsedDict
-
if section is not None:
- return inp.get(section)
- else:
- return inp
+ return self.__parsedCfgDict.get(section)
- def getConfig(self, file_path=None, section=None):
+ def getConfig(self):
'''
- @Name: getConfig
- @Desc : Parses and converts the given configuration file to dictionary
- @Input : file_path: path where the configuration needs to be passed
- section: specific section inside the file
- @Output: INVALID_INPUT: This value is returned if the input
- is invalid or not able to be parsed
- Parsed configuration dictionary from json file
+ @Name : getConfig
+ @Desc : Returns the Parsed Dictionary of Config Provided
+ @Input : NA
+ @Output: ParsedDict if successful if cfg file provided is valid
+ None if cfg file is invalid or not able to be parsed
'''
- ret = None
- if file not in [None, '']:
- if self.__verifyFile(file_path) is False:
- return INVALID_INPUT
- else:
- ret = self.__parseConfig(file_path)
- return self.__getSectionData(ret, section)
+ return self.__parsedCfgDict
def getDeviceUrl(obj):
req = zip(obj.__dict__.keys(), obj.__dict__.values())
if obj.hostname:
- return "http://" + obj.hostname+"?" + "&".join(["=".join([r[0],
- r[1]])
- for r in req])
+ return "http://" + obj.hostname + "?" + "&".join(["=".join([r[0],
+ r[1]])
+ for r in req])
else:
return None
@@ -437,11 +450,11 @@ def descSetupInBasicMode():
z.dns2 = "8.8.4.4"
z.internaldns1 = "192.168.110.254"
z.internaldns2 = "192.168.110.253"
- z.name = "test"+str(l)
+ z.name = "test" + str(l)
z.networktype = 'Basic'
z.securitygroupenabled = 'True'
- #If security groups are reqd
+ # If security groups are reqd
sgprovider = provider()
sgprovider.broadcastdomainrange = 'Pod'
sgprovider.name = 'SecurityGroupProvider'
@@ -467,15 +480,15 @@ def descSetupInBasicMode():
ip = iprange()
ip.gateway = p.gateway
ip.netmask = p.netmask
- ip.startip = "192.168.%d.%d" % (i, j*20)
- ip.endip = "192.168.%d.%d" % (i, j*20+10)
+ ip.startip = "192.168.%d.%d" % (i, j * 20)
+ ip.endip = "192.168.%d.%d" % (i, j * 20 + 10)
p.guestIpRanges.append(ip)
'''add 10 clusters'''
for j in range(2):
c = cluster()
- c.clustername = "test"+str(l)+str(i) + str(j)
+ c.clustername = "test" + str(l) + str(i) + str(j)
c.clustertype = "CloudManaged"
c.hypervisor = "Simulator"
@@ -484,15 +497,16 @@ def descSetupInBasicMode():
h = host()
h.username = "root"
h.password = "password"
- memory = 8*1024*1024*1024
- localstorage = 1*1024*1024*1024*1024
+ memory = 8 * 1024 * 1024 * 1024
+ localstorage = 1 * 1024 * 1024 * 1024 * 1024
h.url = "http://sim/%d%d%d%d" % (l, i, j, k)
c.hosts.append(h)
'''add 2 primary storages'''
for m in range(2):
primary = primaryStorage()
- primary.name = "primary"+str(l) + str(i) + str(j) + str(m)
+ primary.name = "primary" + \
+ str(l) + str(i) + str(j) + str(m)
primary.url = "nfs://localhost/path%s" % (str(l) + str(i) +
str(j) + str(m))
c.primaryStorages.append(primary)
@@ -504,7 +518,7 @@ def descSetupInBasicMode():
'''add two secondary'''
for i in range(5):
secondary = secondaryStorage()
- secondary.url = "nfs://localhost/path"+str(l) + str(i)
+ secondary.url = "nfs://localhost/path" + str(l) + str(i)
z.secondaryStorages.append(secondary)
zs.zones.append(z)
@@ -546,7 +560,7 @@ def descSetupInEipMode():
z.dns2 = "8.8.4.4"
z.internaldns1 = "192.168.110.254"
z.internaldns2 = "192.168.110.253"
- z.name = "test"+str(l)
+ z.name = "test" + str(l)
z.networktype = 'Basic'
ips = iprange()
@@ -557,7 +571,7 @@ def descSetupInEipMode():
ips.netmask = "255.255.255.0"
z.ipranges.append(ips)
- #If security groups are reqd
+ # If security groups are reqd
sgprovider = provider()
sgprovider.broadcastdomainrange = 'Pod'
sgprovider.name = 'SecurityGroupProvider'
@@ -591,15 +605,15 @@ def descSetupInEipMode():
ip = iprange()
ip.gateway = p.gateway
ip.netmask = p.netmask
- ip.startip = "192.168.%d.%d" % (i, j*20)
- ip.endip = "192.168.%d.%d" % (i, j*20+10)
+ ip.startip = "192.168.%d.%d" % (i, j * 20)
+ ip.endip = "192.168.%d.%d" % (i, j * 20 + 10)
p.guestIpRanges.append(ip)
'''add 10 clusters'''
for j in range(2):
c = cluster()
- c.clustername = "test"+str(l)+str(i) + str(j)
+ c.clustername = "test" + str(l) + str(i) + str(j)
c.clustertype = "CloudManaged"
c.hypervisor = "Simulator"
@@ -614,7 +628,8 @@ def descSetupInEipMode():
'''add 2 primary storages'''
for m in range(2):
primary = primaryStorage()
- primary.name = "primary"+str(l) + str(i) + str(j) + str(m)
+ primary.name = "primary" + \
+ str(l) + str(i) + str(j) + str(m)
primary.url = "nfs://localhost/path%s" % (str(l) + str(i)
+ str(j)
+ str(m))
@@ -627,7 +642,7 @@ def descSetupInEipMode():
'''add two secondary'''
for i in range(5):
secondary = secondaryStorage()
- secondary.url = "nfs://localhost/path"+str(l) + str(i)
+ secondary.url = "nfs://localhost/path" + str(l) + str(i)
z.secondaryStorages.append(secondary)
zs.zones.append(z)
@@ -667,7 +682,7 @@ def descSetupInAdvancedMode():
z.dns2 = "8.8.4.4"
z.internaldns1 = "192.168.110.254"
z.internaldns2 = "192.168.110.253"
- z.name = "test"+str(l)
+ z.name = "test" + str(l)
z.networktype = 'Advanced'
z.guestcidraddress = "10.1.1.0/24"
z.vlan = "100-2000"
@@ -703,7 +718,7 @@ def descSetupInAdvancedMode():
'''add 10 clusters'''
for j in range(2):
c = cluster()
- c.clustername = "test"+str(l)+str(i) + str(j)
+ c.clustername = "test" + str(l) + str(i) + str(j)
c.clustertype = "CloudManaged"
c.hypervisor = "Simulator"
@@ -714,7 +729,7 @@ def descSetupInAdvancedMode():
h.password = "password"
memory = 8 * 1024 * 1024 * 1024
localstorage = 1 * 1024 * 1024 * 1024 * 1024
- #h.url = "http://sim/%d%d%d%d/cpucore=1&cpuspeed=8000&\
+ # h.url = "http://sim/%d%d%d%d/cpucore=1&cpuspeed=8000&\
# memory=%d&localstorage=%d"%(l, i, j, k, memory,
# localstorage)
h.url = "http://sim/%d%d%d%d" % (l, i, j, k)
@@ -723,8 +738,9 @@ def descSetupInAdvancedMode():
'''add 2 primary storages'''
for m in range(2):
primary = primaryStorage()
- primary.name = "primary"+str(l) + str(i) + str(j) + str(m)
- #primary.url = "nfs://localhost/path%s/size=%d" %
+ primary.name = "primary" + \
+ str(l) + str(i) + str(j) + str(m)
+ # primary.url = "nfs://localhost/path%s/size=%d" %
# (str(l) + str(i) + str(j) + str(m), size)
primary.url = "nfs://localhost/path%s" % (str(l) + str(i)
+ str(j)
@@ -738,7 +754,7 @@ def descSetupInAdvancedMode():
'''add two secondary'''
for i in range(5):
secondary = secondaryStorage()
- secondary.url = "nfs://localhost/path"+str(l) + str(i)
+ secondary.url = "nfs://localhost/path" + str(l) + str(i)
z.secondaryStorages.append(secondary)
'''add default public network'''
@@ -788,7 +804,7 @@ def descSetupInAdvancedsgMode():
z.dns2 = "8.8.4.4"
z.internaldns1 = "192.168.110.254"
z.internaldns2 = "192.168.110.253"
- z.name = "test"+str(l)
+ z.name = "test" + str(l)
z.networktype = 'Advanced'
z.vlan = "100-2000"
z.securitygroupenabled = "true"
@@ -797,7 +813,7 @@ def descSetupInAdvancedsgMode():
pn.name = "test-network"
pn.traffictypes = [trafficType("Guest"), trafficType("Management")]
- #If security groups are reqd
+ # If security groups are reqd
sgprovider = provider()
sgprovider.broadcastdomainrange = 'ZONE'
sgprovider.name = 'SecurityGroupProvider'
@@ -817,7 +833,7 @@ def descSetupInAdvancedsgMode():
'''add 10 clusters'''
for j in range(2):
c = cluster()
- c.clustername = "test"+str(l)+str(i) + str(j)
+ c.clustername = "test" + str(l) + str(i) + str(j)
c.clustertype = "CloudManaged"
c.hypervisor = "Simulator"
@@ -828,17 +844,18 @@ def descSetupInAdvancedsgMode():
h.password = "password"
memory = 8 * 1024 * 1024 * 1024
localstorage = 1 * 1024 * 1024 * 1024 * 1024
- #h.url = "http://sim/%d%d%d%d/cpucore=1&cpuspeed=8000&\
- #memory=%d&localstorage=%d" % (l, i, j, k, memory,
- #localstorage)
+ # h.url = "http://sim/%d%d%d%d/cpucore=1&cpuspeed=8000&\
+ # memory=%d&localstorage=%d" % (l, i, j, k, memory,
+ # localstorage)
h.url = "http://sim/%d%d%d%d" % (l, i, j, k)
c.hosts.append(h)
'''add 2 primary storages'''
for m in range(2):
primary = primaryStorage()
- primary.name = "primary"+str(l) + str(i) + str(j) + str(m)
- #primary.url = "nfs://localhost/path%s/size=%d" % \
+ primary.name = "primary" + \
+ str(l) + str(i) + str(j) + str(m)
+ # primary.url = "nfs://localhost/path%s/size=%d" % \
#(str(l) + str(i) + str(j) + str(m), size)
primary.url = "nfs://localhost/path%s" % \
(str(l) + str(i) + str(j) + str(m))
@@ -851,7 +868,7 @@ def descSetupInAdvancedsgMode():
'''add two secondary'''
for i in range(5):
secondary = secondaryStorage()
- secondary.url = "nfs://localhost/path"+str(l) + str(i)
+ secondary.url = "nfs://localhost/path" + str(l) + str(i)
z.secondaryStorages.append(secondary)
'''add default guest network'''
@@ -901,18 +918,19 @@ def generate_setup_config(config, file=None):
def getSetupConfig(file):
- 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)
+ 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 as e:
+ print "\nException Occurred under getSetupConfig %s" % \
+ GetDetailExceptionInfo(e)
if __name__ == "__main__":
parser = OptionParser()
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/404ac549/tools/marvin/marvin/dbConnection.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/dbConnection.py b/tools/marvin/marvin/dbConnection.py
index 99014ab..66c6cb1 100644
--- a/tools/marvin/marvin/dbConnection.py
+++ b/tools/marvin/marvin/dbConnection.py
@@ -20,12 +20,13 @@ 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
-class dbConnection(object):
+class DbConnection(object):
+
def __init__(self, host="localhost", port=3306, user='cloud',
passwd='cloud', db='cloud'):
self.host = host
@@ -51,7 +52,7 @@ class dbConnection(object):
try:
resultRow = cursor.fetchall()
except errors.InterfaceError:
- #Raised on empty result - DML
+ # Raised on empty result - DML
resultRow = []
return resultRow
@@ -68,7 +69,7 @@ class dbConnection(object):
return self.execute(sqls)
if __name__ == "__main__":
- db = dbConnection()
+ db = DbConnection()
'''
try:
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/404ac549/tools/marvin/marvin/deployAndRun.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/deployAndRun.py b/tools/marvin/marvin/deployAndRun.py
index 56747a7..d3b6b86 100644
--- a/tools/marvin/marvin/deployAndRun.py
+++ b/tools/marvin/marvin/deployAndRun.py
@@ -15,13 +15,13 @@
# specific language governing permissions and limitations
# under the License.
-from tcExecuteEngine import TestCaseExecuteEngine
+from .tcExecuteEngine import TestCaseExecuteEngine
import sys
import os
import traceback
import time
from argparse import ArgumentParser
-from marvinInit import MarvinInit
+from .marvinInit import MarvinInit
from marvin.codes import (SUCCESS,
FAILED,
EXCEPTION,
@@ -96,7 +96,7 @@ def startMarvin(cfg_file, load_flag):
else:
print "\nMarvin Initialization Failed"
exit(1)
- except Exception, e:
+ except Exception as e:
print "\n Exception occurred while starting Marvin %s" % str(e)
exit(1)