mirror of
https://github.com/apache/cloudstack.git
synced 2025-11-02 20:02:29 +01:00
CLOUDSTACK-5674: Few fixes
This commit is contained in:
parent
995e3f5b5d
commit
e6b93b0a68
@ -218,14 +218,5 @@
|
||||
"certCAPath": "NA",
|
||||
"certPath": "NA"
|
||||
}
|
||||
],
|
||||
"ApiLoadCfg":
|
||||
{
|
||||
"ParsedApiDestFolder": ".",
|
||||
"ApiSpecFile": "/etc/cloud/cli/commands.xml"
|
||||
},
|
||||
"TestData":
|
||||
{
|
||||
"Path": "config/config.cfg"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@ -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"])
|
||||
|
||||
|
||||
@ -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"
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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(
|
||||
|
||||
@ -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 = []
|
||||
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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"])
|
||||
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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':
|
||||
|
||||
@ -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(
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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(
|
||||
|
||||
@ -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(
|
||||
|
||||
@ -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 ??
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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(
|
||||
|
||||
@ -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(
|
||||
|
||||
@ -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(
|
||||
|
||||
@ -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):
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -16,7 +16,7 @@
|
||||
# under the License.
|
||||
|
||||
import threading
|
||||
import cloudstackException
|
||||
from marvin import cloudstackException
|
||||
import time
|
||||
import Queue
|
||||
import copy
|
||||
|
||||
@ -38,7 +38,7 @@ from requests import (
|
||||
Timeout,
|
||||
RequestException
|
||||
)
|
||||
from cloudstackException import GetDetailExceptionInfo
|
||||
from marvin.cloudstackException import GetDetailExceptionInfo
|
||||
|
||||
|
||||
class CSConnection(object):
|
||||
|
||||
@ -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 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 +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 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 +200,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)
|
||||
@ -233,8 +232,9 @@ class CSTestClient(object):
|
||||
providing their own configuration file as well.
|
||||
'''
|
||||
self.__configObj = ConfigManager(self.__testDataFilePath)
|
||||
if self.__configObj is not None:
|
||||
if self.__configObj:
|
||||
self.__parsedTestDataConfig = self.__configObj.getConfig()
|
||||
self.__logger.debug("Parsing Test data successful")
|
||||
else:
|
||||
self.__logger.error("createTestClient : Not able to create "
|
||||
"ConfigManager Object")
|
||||
@ -246,7 +246,14 @@ 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 +375,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
|
||||
|
||||
@ -1,454 +1,410 @@
|
||||
# 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"
|
||||
}
|
||||
}
|
||||
{
|
||||
"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"
|
||||
}
|
||||
}
|
||||
|
||||
@ -20,6 +20,7 @@ import os
|
||||
from optparse import OptionParser
|
||||
import jsonHelper
|
||||
from marvin.codes import *
|
||||
from marvin.cloudstackException import GetDetailExceptionInfo
|
||||
|
||||
|
||||
class managementServer(object):
|
||||
@ -53,12 +54,6 @@ 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 = []
|
||||
@ -66,6 +61,7 @@ class cloudstackConfiguration(object):
|
||||
self.dbSvr = None
|
||||
self.globalConfig = []
|
||||
self.logger = []
|
||||
self.TestData = None
|
||||
|
||||
|
||||
class zone(object):
|
||||
@ -332,10 +328,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 +336,10 @@ 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 = str(os.path.join(dirPath, "config/test_data.cfg"))
|
||||
self.__parsedCfgDict = self.__parseConfig()
|
||||
|
||||
def __parseConfig(self):
|
||||
'''
|
||||
@ -358,16 +353,18 @@ class ConfigManager(object):
|
||||
config_dict = None
|
||||
try:
|
||||
configlines = []
|
||||
with open(file, 'r') as fp:
|
||||
count = 0
|
||||
with open(self.__filePath, 'r') as fp:
|
||||
for line in fp:
|
||||
print "line number",count+1
|
||||
if len(line) != 0:
|
||||
ws = line.strip()
|
||||
if ws[0] not in ["#"]:
|
||||
if not ws.startswith("#"):
|
||||
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
|
||||
print "\n Exception occurred under ConfigManager:__parseConfig :%s", GetDetailExceptionInfo(e)
|
||||
finally:
|
||||
return config_dict
|
||||
|
||||
@ -382,7 +379,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):
|
||||
'''
|
||||
@ -894,18 +891,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, e:
|
||||
# print "\nException Occurred under getSetupConfig %s" %\
|
||||
# GetDetailExceptionInfo(e)
|
||||
|
||||
if __name__ == "__main__":
|
||||
parser = OptionParser()
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -682,11 +682,12 @@ 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("DataCenter",
|
||||
ret = log_obj.createLogs("DeployDataCenter",
|
||||
cfg.logger)
|
||||
if ret != FAILED:
|
||||
log_folder_path = log_obj.getLogFolderPath()
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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.
|
||||
|
||||
'''
|
||||
|
||||
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
|
||||
@ -45,34 +44,35 @@ import logging
|
||||
import string
|
||||
import random
|
||||
from sys import exit
|
||||
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
|
||||
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 self.__configFile is None:
|
||||
if not os.path.isfile(self.__configFile):
|
||||
return FAILED
|
||||
print "*********SETUP**********",type(configGenerator.getSetupConfig(self.__configFile))
|
||||
self.__parsedConfig = configGenerator.\
|
||||
getSetupConfig(self.__configFile)
|
||||
return SUCCESS
|
||||
@ -93,7 +93,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 +114,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 +131,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 +141,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,
|
||||
self.__parsedConfig.logger)
|
||||
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 +164,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 +174,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 +183,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 +200,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,
|
||||
self.__parsedConfig,
|
||||
self.__tcRunLogger)
|
||||
return deploy_obj.deploy() if self.__deployFlag else FAILED
|
||||
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
|
||||
except Exception, e:
|
||||
print "\n Exception Occurred Under __deployDC : %s" % \
|
||||
GetDetailExceptionInfo(e)
|
||||
|
||||
@ -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,16 @@ class MarvinLog:
|
||||
@Output : SUCCESS\FAILED
|
||||
'''
|
||||
try:
|
||||
if log_cfg is None:
|
||||
print "\nInvalid Log Folder Configuration." \
|
||||
"Please Check Config File"
|
||||
return FAILED
|
||||
temp_ts = time.strftime("%b_%d_%Y_%H_%M_%S",
|
||||
time.localtime())
|
||||
if test_module_name is None:
|
||||
temp_path = time.strftime("%b_%d_%Y_%H_%M_%S",
|
||||
time.localtime())
|
||||
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:
|
||||
@ -155,7 +155,6 @@ class MarvinLog:
|
||||
print "\n*********Log Folder Path: %s. " \
|
||||
"All logs will be available here **************" \
|
||||
% str(self.__logFolderDir)
|
||||
|
||||
os.makedirs(self.__logFolderDir)
|
||||
|
||||
'''
|
||||
|
||||
@ -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
|
||||
from sys import stdout, exit
|
||||
import logging
|
||||
import time
|
||||
import os
|
||||
import nose.core
|
||||
from marvin.cloudstackTestCase import cloudstackTestCase
|
||||
from marvin.marvinInit import MarvinInit
|
||||
@ -26,8 +27,6 @@ from marvin.codes import (SUCCESS,
|
||||
FAILED,
|
||||
EXCEPTION)
|
||||
from marvin.cloudstackException import GetDetailExceptionInfo
|
||||
import time
|
||||
import os
|
||||
|
||||
|
||||
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 = 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,13 @@ 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
|
||||
if self.startMarvin() == FAILED:
|
||||
print "\nExiting Marvin. Please Check"
|
||||
exit(1)
|
||||
|
||||
def options(self, parser, env):
|
||||
"""
|
||||
@ -92,32 +88,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,112 +111,149 @@ 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):
|
||||
'''
|
||||
@Desc : Verifies to Import the test Module before running and check
|
||||
@Name : __checkImport
|
||||
@Desc : Verifies to run the available test module for any Import
|
||||
Errors 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:
|
||||
__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 prepareTestRunner(self, runner):
|
||||
if self.__testRunner:
|
||||
return self.__testRunner
|
||||
|
||||
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) 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
|
||||
'''
|
||||
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)
|
||||
return SUCCESS
|
||||
else:
|
||||
return FAILED
|
||||
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
|
||||
except Exception, e:
|
||||
print "Exception Occurred under startMarvin: %s" % \
|
||||
GetDetailExceptionInfo(e)
|
||||
@ -243,28 +264,30 @@ 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: "
|
||||
"%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:
|
||||
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))
|
||||
|
||||
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)
|
||||
|
||||
@ -25,7 +25,7 @@ from paramiko import (BadHostKeyException,
|
||||
SFTPClient)
|
||||
import socket
|
||||
import time
|
||||
from cloudstackException import (
|
||||
from marvin.cloudstackException import (
|
||||
internalError,
|
||||
GetDetailExceptionInfo
|
||||
)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user