mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
Simplifying the process of running the simulator.
* ant run-simulator - will seed the simulator jar and start CS
* ant run-marvin -Dmarvin.config="/path/config/file" - will
* configure a
cloudstack as per the given configuration. marvin.config - defaults
to a
two host simulator in an advanced zone
You can then connect your debugger over localhost:8787 or use the CS
ui
at localhost:8080/client for testing.
From: Prasanna Santhanam(Prasanna.Santhanam@citrix.com)
This commit is contained in:
parent
ca43092830
commit
b627f5a85b
@ -56,4 +56,16 @@
|
|||||||
</exec>
|
</exec>
|
||||||
<echo message="distributable tarball at: ${marvin.dist.dir}/Marvin-*.tar.gz"/>
|
<echo message="distributable tarball at: ${marvin.dist.dir}/Marvin-*.tar.gz"/>
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
|
<target name="install-marvin" depends="package-marvin" description="installs marvin on the local machine">
|
||||||
|
<echo message="Uninstalling Marvin" />
|
||||||
|
<exec dir="${marvin.dist.dir}" executable="pip">
|
||||||
|
<arg line="uninstall -y marvin"/>
|
||||||
|
</exec>
|
||||||
|
<echo message="Installing Marvin" />
|
||||||
|
<exec dir="${marvin.dist.dir}" executable="pip">
|
||||||
|
<arg value="install" />
|
||||||
|
<arg value="Marvin-0.1.0.tar.gz" />
|
||||||
|
</exec>
|
||||||
|
</target>
|
||||||
</project>
|
</project>
|
||||||
|
|||||||
@ -49,6 +49,10 @@
|
|||||||
<property name="agent-simulator.jar" value="cloud-agent-simulator.jar" />
|
<property name="agent-simulator.jar" value="cloud-agent-simulator.jar" />
|
||||||
<property name="testclient.jar" value="cloud-test.jar" />
|
<property name="testclient.jar" value="cloud-test.jar" />
|
||||||
|
|
||||||
|
<property name="simulator.setup.dir" value="${base.dir}/setup/db/" />
|
||||||
|
<property name="marvin.sandbox.dir" value="${base.dir}/tools/marvin/marvin/sandbox/" />
|
||||||
|
<property name="marvin.config" value="${base.dir}/tools/marvin/marvin/sandbox/demo/simulator/simulator.cfg" />
|
||||||
|
<property name="marvin.config.abspath" location="${marvin.config}" />
|
||||||
|
|
||||||
<!-- =================== Agent Simulator ==================== -->
|
<!-- =================== Agent Simulator ==================== -->
|
||||||
<path id="agent-simulator.classpath">
|
<path id="agent-simulator.classpath">
|
||||||
@ -98,12 +102,33 @@
|
|||||||
<copy todir="${agent-simulator.dist.dir}/conf">
|
<copy todir="${agent-simulator.dist.dir}/conf">
|
||||||
<fileset dir="${agent.dir}/conf">
|
<fileset dir="${agent.dir}/conf">
|
||||||
<include name="log4j-cloud.xml" />
|
<include name="log4j-cloud.xml" />
|
||||||
<include name="simulator.properties" />
|
|
||||||
</fileset>
|
</fileset>
|
||||||
</copy>
|
</copy>
|
||||||
</target>
|
</target>
|
||||||
<!-- =================== Agent Simulator ==================== -->
|
<!-- =================== Agent Simulator ==================== -->
|
||||||
|
|
||||||
|
<!-- Run Simulator Tests -->
|
||||||
|
<target name="setup-simulator" depends="clean-all">
|
||||||
|
<mkdir dir="${simulator.setup.dir}/override">
|
||||||
|
</mkdir>
|
||||||
|
<copy overwrite="true" file="${simulator.setup.dir}/templates.simulator.sql" tofile="${simulator.setup.dir}/override/templates.sql" />
|
||||||
|
|
||||||
|
<mkdir dir="${build.dir}/override">
|
||||||
|
</mkdir>
|
||||||
|
<copy overwrite="true" file="${build.dir}/replace.properties" tofile="${build.dir}/override/replace.properties" />
|
||||||
|
<!-- Replace the COMPONENT-SPEC for components-simulator.xml -->
|
||||||
|
<copy overwrite="true" file="${build.dir}/simulator.properties" tofile="${build.dir}/override/replace.properties" />
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<target name="run-simulator" depends="setup-simulator, build-all-with-simulator, deploy-server, deploydb-simulator, debug">
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<target name="run-marvin" depends="install-marvin">
|
||||||
|
<exec dir="${marvin.sandbox.dir}/" executable="bash">
|
||||||
|
<arg line="run-marvin.sh -d localhost -m localhost -c ${marvin.config.abspath}" />
|
||||||
|
</exec>
|
||||||
|
</target>
|
||||||
|
<!-- -->
|
||||||
|
|
||||||
<!-- =================== QA Testing Client ==================== -->
|
<!-- =================== QA Testing Client ==================== -->
|
||||||
<target name="-init-test" depends="-init">
|
<target name="-init-test" depends="-init">
|
||||||
|
|||||||
11
build/simulator.properties
Normal file
11
build/simulator.properties
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
DBUSER=cloud
|
||||||
|
DBPW=cloud
|
||||||
|
MSLOG=vmops.log
|
||||||
|
APISERVERLOG=api.log
|
||||||
|
DBHOST=localhost
|
||||||
|
DBROOTPW=
|
||||||
|
AGENTLOGDIR=logs
|
||||||
|
AGENTLOG=logs/agent.log
|
||||||
|
MSMNTDIR=/mnt
|
||||||
|
COMPONENTS-SPEC=components-simulator.xml
|
||||||
|
AWSAPILOG=awsapi.log
|
||||||
@ -3,12 +3,12 @@ Welcome to the marvin sandbox
|
|||||||
|
|
||||||
In here you should find a few common deployment models of CloudStack that you
|
In here you should find a few common deployment models of CloudStack that you
|
||||||
can configure with properties files to suit your own deployment. One deployment
|
can configure with properties files to suit your own deployment. One deployment
|
||||||
model for each of - advanced zone, basic zone and a demo are given.
|
model for each of - advanced zone, basic zone and a simulator demo are given.
|
||||||
|
|
||||||
$ ls -
|
$ ls -
|
||||||
basic/
|
basic/
|
||||||
advanced/
|
advanced/
|
||||||
demo/
|
simulator/
|
||||||
|
|
||||||
Each property file is divided into logical sections and should be familiar to
|
Each property file is divided into logical sections and should be familiar to
|
||||||
those who have deployed CloudStack before. Once you have your properties file
|
those who have deployed CloudStack before. Once you have your properties file
|
||||||
@ -17,3 +17,14 @@ python script provided in the respective folder.
|
|||||||
|
|
||||||
The demo files are from the tutorial for testing with python that can be found
|
The demo files are from the tutorial for testing with python that can be found
|
||||||
on the wiki.cloudstack.org
|
on the wiki.cloudstack.org
|
||||||
|
|
||||||
|
A common deployment model of a simulator.cfg that can be used for debugging is
|
||||||
|
included. This will configure an advanced zone with simulators that can be used
|
||||||
|
for debugging purposes when you do not have hardware to debug with.
|
||||||
|
|
||||||
|
To do this:
|
||||||
|
$ cd cloudstack-oss/
|
||||||
|
$ ant run-simulator #This will start up the mgmt server with the simulator seeded
|
||||||
|
|
||||||
|
## In another shell
|
||||||
|
$ ant run-simulator
|
||||||
|
|||||||
159
tools/marvin/marvin/sandbox/demo/simulator/simulator.cfg
Normal file
159
tools/marvin/marvin/sandbox/demo/simulator/simulator.cfg
Normal file
@ -0,0 +1,159 @@
|
|||||||
|
{
|
||||||
|
"zones": [
|
||||||
|
{
|
||||||
|
"name": "Sandbox-simulator",
|
||||||
|
"guestcidraddress": "10.1.1.0/24",
|
||||||
|
"providers": [
|
||||||
|
{
|
||||||
|
"broadcastdomainrange": "ZONE",
|
||||||
|
"name": "VirtualRouter"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"dns1": "10.147.28.6",
|
||||||
|
"vlan": "100-200",
|
||||||
|
"ipranges": [
|
||||||
|
{
|
||||||
|
"startip": "10.147.31.2",
|
||||||
|
"endip": "10.147.31.200",
|
||||||
|
"netmask": "255.255.255.0",
|
||||||
|
"vlan": "31",
|
||||||
|
"gateway": "10.147.31.1"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"networktype": "Advanced",
|
||||||
|
"pods": [
|
||||||
|
{
|
||||||
|
"endip": "10.147.29.200",
|
||||||
|
"name": "POD0",
|
||||||
|
"startip": "10.147.29.2",
|
||||||
|
"netmask": "255.255.255.0",
|
||||||
|
"clusters": [
|
||||||
|
{
|
||||||
|
"clustername": "C0",
|
||||||
|
"hypervisor": "simulator",
|
||||||
|
"hosts": [
|
||||||
|
{
|
||||||
|
"username": "root",
|
||||||
|
"url": "http://sim/c0/h0",
|
||||||
|
"password": "password"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"username": "root",
|
||||||
|
"url": "http://sim/c0/h1",
|
||||||
|
"password": "password"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"clustertype": "CloudManaged",
|
||||||
|
"primaryStorages": [
|
||||||
|
{
|
||||||
|
"url": "nfs://10.147.28.6:/export/home/sandbox/primary",
|
||||||
|
"name": "PS0"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"gateway": "10.147.29.1"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"internaldns1": "10.147.28.6",
|
||||||
|
"secondaryStorages": [
|
||||||
|
{
|
||||||
|
"url": "nfs://10.147.28.6:/export/home/sandbox/secondary"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"dbSvr": {
|
||||||
|
"dbSvr": "localhost",
|
||||||
|
"passwd": "cloud",
|
||||||
|
"db": "cloud",
|
||||||
|
"port": 3306,
|
||||||
|
"user": "cloud"
|
||||||
|
},
|
||||||
|
"logger": [
|
||||||
|
{
|
||||||
|
"name": "TestClient",
|
||||||
|
"file": "/var/log/testclient.log"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "TestCase",
|
||||||
|
"file": "/var/log/testcase.log"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"globalConfig": [
|
||||||
|
{
|
||||||
|
"name": "storage.cleanup.interval",
|
||||||
|
"value": "300"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "vm.op.wait.interval",
|
||||||
|
"value": "5"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "default.page.size",
|
||||||
|
"value": "10000"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "instance.name",
|
||||||
|
"value": "QA"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "workers",
|
||||||
|
"value": "10"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "use.user.concentrated.pod.allocation",
|
||||||
|
"value": "false"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "account.cleanup.interval",
|
||||||
|
"value": "600"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "guest.domain.suffix",
|
||||||
|
"value": "sandbox.simulator"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "expunge.delay",
|
||||||
|
"value": "60"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "network.gc.wait",
|
||||||
|
"value": "60"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "network.gc.interval",
|
||||||
|
"value": "60"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "vm.allocation.algorithm",
|
||||||
|
"value": "random"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "expunge.interval",
|
||||||
|
"value": "60"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "expunge.workers",
|
||||||
|
"value": "3"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "check.pod.cidrs",
|
||||||
|
"value": "true"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "secstorage.allowed.internal.sites",
|
||||||
|
"value": "10.147.28.0/24"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "direct.agent.load.size",
|
||||||
|
"value": "1000"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"mgtSvr": [
|
||||||
|
{
|
||||||
|
"mgtSvrIp": "localhost",
|
||||||
|
"port": 8096
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
66
tools/marvin/marvin/sandbox/run-marvin.sh
Normal file
66
tools/marvin/marvin/sandbox/run-marvin.sh
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
usage() {
|
||||||
|
printf "Usage: %s:\n
|
||||||
|
[-m mgmt-server ] \n
|
||||||
|
[-c config-file ] \n
|
||||||
|
[-d db node url ]\n" $(basename $0) >&2
|
||||||
|
}
|
||||||
|
|
||||||
|
failed() {
|
||||||
|
exit $1
|
||||||
|
}
|
||||||
|
|
||||||
|
#defaults
|
||||||
|
FMT=$(date +"%d_%I_%Y_%s")
|
||||||
|
MGMT_SVR="localhost"
|
||||||
|
CONFIG="demo/simulator/simulator-smoke.cfg"
|
||||||
|
DB_SVR="localhost"
|
||||||
|
|
||||||
|
while getopts 'd:m:c:' OPTION
|
||||||
|
do
|
||||||
|
case $OPTION in
|
||||||
|
d) dflag=1
|
||||||
|
DB_SVR="$OPTARG"
|
||||||
|
;;
|
||||||
|
m) mflag=1
|
||||||
|
MGMT_SVR="$OPTARG"
|
||||||
|
;;
|
||||||
|
c) cflag=1
|
||||||
|
CONFIG="$OPTARG"
|
||||||
|
;;
|
||||||
|
?) usage
|
||||||
|
failed 2
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
$(mysql -uroot -Dcloud -h$MGMT_SVR -s -N -r -e"update configuration set value='8096' where name='integration.api.port'")
|
||||||
|
version_tuple=$(python -c 'import sys; print(sys.version_info[:2])')
|
||||||
|
|
||||||
|
if [[ $version_tuple == "(2, 7)" ]]
|
||||||
|
then
|
||||||
|
python -m marvin.deployAndRun -c $CONFIG -t /tmp/t.log -r /tmp/r.log -d /tmp
|
||||||
|
sleep 60
|
||||||
|
python -m marvin.deployAndRun -c $CONFIG -t /tmp/t.log -r /tmp/r.log -f testSetupSuccess.py -l
|
||||||
|
cat /tmp/r.log
|
||||||
|
echo "Done"
|
||||||
|
else
|
||||||
|
echo "Python version 2.7 not detected on system. Aborting"
|
||||||
|
fi
|
||||||
81
tools/marvin/marvin/sandbox/testSetupSuccess.py
Normal file
81
tools/marvin/marvin/sandbox/testSetupSuccess.py
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
# 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.
|
||||||
|
|
||||||
|
import marvin
|
||||||
|
import unittest
|
||||||
|
from marvin.cloudstackTestCase import *
|
||||||
|
from marvin.cloudstackAPI import *
|
||||||
|
from time import sleep as delay
|
||||||
|
|
||||||
|
class TestSetupSuccess(cloudstackTestCase):
|
||||||
|
"""
|
||||||
|
Test to verify if the cloudstack is ready to launch tests upon
|
||||||
|
1. Verify that system VMs are up and running in all zones
|
||||||
|
2. Verify that built-in templates are Ready in all zones
|
||||||
|
"""
|
||||||
|
@classmethod
|
||||||
|
def setUpClass(cls):
|
||||||
|
cls.apiClient = super(TestSetupSuccess, cls).getClsTestClient().getApiClient()
|
||||||
|
|
||||||
|
zones = listZones.listZonesCmd()
|
||||||
|
cls.zones_list = cls.apiClient.listZones(zones)
|
||||||
|
cls.retry = 50
|
||||||
|
|
||||||
|
def test_systemVmReady(self):
|
||||||
|
"""
|
||||||
|
system VMs need to be ready and Running for each zone in cloudstack
|
||||||
|
"""
|
||||||
|
for z in self.zones_list:
|
||||||
|
retry = self.retry
|
||||||
|
while retry != 0:
|
||||||
|
self.debug("looking for system VMs in zone: %s, %s"%(z.id, z.name))
|
||||||
|
sysvms = listSystemVms.listSystemVmsCmd()
|
||||||
|
sysvms.zoneid = z.id
|
||||||
|
sysvms.state = 'Running'
|
||||||
|
sysvms_list = self.apiClient.listSystemVms(sysvms)
|
||||||
|
if sysvms_list is not None and len(sysvms_list) == 2:
|
||||||
|
assert len(sysvms_list) == 2
|
||||||
|
self.debug("found %d system VMs running {%s}"%(len(sysvms_list), sysvms_list))
|
||||||
|
break
|
||||||
|
retry = retry - 1
|
||||||
|
delay(60) #wait a minute for retry
|
||||||
|
self.assertNotEqual(retry, 0, "system VMs not Running in zone %s"%z.name)
|
||||||
|
|
||||||
|
def test_templateBuiltInReady(self):
|
||||||
|
"""
|
||||||
|
built-in templates CentOS to be ready
|
||||||
|
"""
|
||||||
|
for z in self.zones_list:
|
||||||
|
retry = self.retry
|
||||||
|
while retry != 0:
|
||||||
|
self.debug("Looking for at least one ready builtin template")
|
||||||
|
templates = listTemplates.listTemplatesCmd()
|
||||||
|
templates.templatefilter = 'featured'
|
||||||
|
templates.listall = 'true'
|
||||||
|
templates_list = self.apiClient.listTemplates(templates)
|
||||||
|
if templates_list is not None:
|
||||||
|
builtins = [tmpl for tmpl in templates_list if tmpl.templatetype == 'BUILTIN' and tmpl.isready == True]
|
||||||
|
if len(builtins) > 0:
|
||||||
|
self.debug("Found %d builtins ready for use %s"%(len(builtins), builtins))
|
||||||
|
break
|
||||||
|
retry = retry - 1
|
||||||
|
delay(60) #wait a minute for retry
|
||||||
|
self.assertNotEqual(retry, 0, "builtIn templates not ready in zone %s"%z.name)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def tearDownClass(cls):
|
||||||
|
pass
|
||||||
Loading…
x
Reference in New Issue
Block a user