From 6a8257127b3dce1f18a650afe6921a34b6c6f5b8 Mon Sep 17 00:00:00 2001 From: liyin Date: Mon, 8 May 2017 09:04:32 +0000 Subject: [PATCH] Delete testcase of rubbos and vstf. JIRA:BOTTLENECK-167 This patch will delete vstf and rubbos testcase code. Include some testcase config file, if there will be someone who want to use this testcase maybe B or C version code will contain those testcase. if you use the D version code to run this two testcase we will info you that: Rubbos testsuite is not updating anymore. This entrance for running Rubbos within Bottlenecks is no longer supported. Change-Id: I04e4042ff3998b3696df2ed47a9ffab6f1620ec3 Signed-off-by: liyin --- ci/vstf_run.sh | 26 - run_posca.sh | 54 - .../rubbos/puppet_manifests/internal/rubbos.conf | 45 - .../internal/run_rubbos_internal.sh | 403 -------- .../modules/params/manifests/rubbos_params.pp | 23 - .../modules/rubbos_client/files/Makefile | 86 -- .../modules/rubbos_client/files/build.properties | 16 - .../modules/rubbos_client/files/config.mk | 36 - .../rubbos_client/files/rubbos.properties.template | 85 -- .../modules/rubbos_client/files/run_emulator.sh | 16 - .../rubbos_client/manifests/rubbos_client_off.pp | 103 -- .../rubbos_client/manifests/rubbos_client_on.pp | 179 ---- .../rubbos_common/manifests/rubbos_common_on.pp | 72 -- .../rubbos_httpd/files/apache_conf/httpd.conf | 324 ------ .../files/apache_conf/workers.properties | 64 -- .../rubbos_httpd/manifests/rubbos_httpd_off.pp | 85 -- .../rubbos_httpd/manifests/rubbos_httpd_on.pp | 159 --- .../rubbos_monitor/manifests/rubbos_monitor_off.pp | 53 - .../rubbos_monitor/manifests/rubbos_monitor_on.pp | 110 -- .../rubbos_mysql/files/prepare_rubbos_mysql_db.sh | 49 - .../rubbos_mysql/manifests/rubbos_mysql_off.pp | 86 -- .../rubbos_mysql/manifests/rubbos_mysql_on.pp | 98 -- .../rubbos_tomcat/files/tomcat_sl/build.properties | 7 - .../rubbos_tomcat/files/tomcat_sl/mysql.properties | 17 - .../files/tomcat_sl/rubbos_files/Makefile | 79 -- .../files/tomcat_sl/rubbos_files/config.mk | 32 - .../rubbos_tomcat/manifests/rubbos_tomcat_off.pp | 80 -- .../rubbos_tomcat/manifests/rubbos_tomcat_on.pp | 201 ---- testsuites/rubbos/puppet_manifests/site_off.pp | 35 - testsuites/rubbos/puppet_manifests/site_on.pp | 39 - .../rubbos_scripts/1-1-1/apache_conf/httpd.conf | 1076 -------------------- .../1-1-1/apache_conf/workers.properties_template | 215 ---- .../rubbos/rubbos_scripts/1-1-1/mysql_conf/my.cnf | 6 - testsuites/rubbos/rubbos_scripts/1-1-1/nsFile.txt | 48 - .../rubbos_scripts/1-1-1/rubbos_conf/Makefile | 80 -- .../1-1-1/rubbos_conf/build.properties | 8 - .../rubbos_scripts/1-1-1/rubbos_conf/config.mk | 32 - .../rubbos_scripts/1-1-1/rubbos_conf/cpu_mem.sh | 100 -- .../1-1-1/rubbos_conf/mysql.properties_template | 83 -- .../1-1-1/rubbos_conf/rubbos-servletsBO.sh | 77 -- .../1-1-1/rubbos_conf/rubbos-servletsRW.sh | 83 -- .../1-1-1/rubbos_conf/rubbos.properties_template | 79 -- .../1-1-1/scripts/BENCHMARK_configure.sh | 34 - .../1-1-1/scripts/BENCHMARK_install.sh | 23 - .../1-1-1/scripts/BENCHMARK_pkg_prepare.sh | 45 - .../1-1-1/scripts/BENCHMARK_rubbos_install.sh | 38 - .../1-1-1/scripts/BENCHMARK_rubbos_uninstall.sh | 18 - .../1-1-1/scripts/BENCHMARK_uninstall.sh | 15 - .../1-1-1/scripts/CLIENT1_configure.sh | 34 - .../1-1-1/scripts/CLIENT1_install.sh | 23 - .../1-1-1/scripts/CLIENT1_pkg_prepare.sh | 45 - .../1-1-1/scripts/CLIENT1_rubbos_install.sh | 38 - .../1-1-1/scripts/CLIENT1_rubbos_uninstall.sh | 18 - .../1-1-1/scripts/CLIENT1_uninstall.sh | 15 - .../1-1-1/scripts/CLIENT2_configure.sh | 34 - .../1-1-1/scripts/CLIENT2_install.sh | 23 - .../1-1-1/scripts/CLIENT2_pkg_prepare.sh | 45 - .../1-1-1/scripts/CLIENT2_rubbos_install.sh | 38 - .../1-1-1/scripts/CLIENT2_rubbos_uninstall.sh | 18 - .../1-1-1/scripts/CLIENT2_uninstall.sh | 15 - .../1-1-1/scripts/CLIENT3_configure.sh | 34 - .../1-1-1/scripts/CLIENT3_install.sh | 23 - .../1-1-1/scripts/CLIENT3_pkg_prepare.sh | 45 - .../1-1-1/scripts/CLIENT3_rubbos_install.sh | 38 - .../1-1-1/scripts/CLIENT3_rubbos_uninstall.sh | 18 - .../1-1-1/scripts/CLIENT3_uninstall.sh | 15 - .../1-1-1/scripts/CLIENT4_configure.sh | 34 - .../1-1-1/scripts/CLIENT4_install.sh | 23 - .../1-1-1/scripts/CLIENT4_pkg_prepare.sh | 45 - .../1-1-1/scripts/CLIENT4_rubbos_install.sh | 38 - .../1-1-1/scripts/CLIENT4_rubbos_uninstall.sh | 18 - .../1-1-1/scripts/CLIENT4_uninstall.sh | 15 - .../1-1-1/scripts/CONTROL_checkScp_exec.sh | 28 - .../1-1-1/scripts/CONTROL_emulabConf_exec.sh | 63 -- .../1-1-1/scripts/CONTROL_rubbos_exec.sh | 151 --- .../1-1-1/scripts/HTTPD_configure.sh | 25 - .../rubbos_scripts/1-1-1/scripts/HTTPD_ignition.sh | 19 - .../rubbos_scripts/1-1-1/scripts/HTTPD_install.sh | 44 - .../1-1-1/scripts/HTTPD_pkg_prepare.sh | 50 - .../1-1-1/scripts/HTTPD_rubbos_install.sh | 34 - .../1-1-1/scripts/HTTPD_rubbos_uninstall.sh | 17 - .../rubbos_scripts/1-1-1/scripts/HTTPD_stop.sh | 20 - .../1-1-1/scripts/HTTPD_uninstall.sh | 17 - .../1-1-1/scripts/MYSQL1_configure.sh | 31 - .../1-1-1/scripts/MYSQL1_ignition.sh | 22 - .../rubbos_scripts/1-1-1/scripts/MYSQL1_install.sh | 41 - .../1-1-1/scripts/MYSQL1_pkg_prepare.sh | 41 - .../rubbos_scripts/1-1-1/scripts/MYSQL1_reset.sh | 49 - .../1-1-1/scripts/MYSQL1_rubbos_install.sh | 34 - .../1-1-1/scripts/MYSQL1_rubbos_uninstall.sh | 17 - .../rubbos_scripts/1-1-1/scripts/MYSQL1_stop.sh | 20 - .../1-1-1/scripts/MYSQL1_uninstall.sh | 15 - .../1-1-1/scripts/TOMCAT1_configure.sh | 18 - .../1-1-1/scripts/TOMCAT1_ignition.sh | 19 - .../1-1-1/scripts/TOMCAT1_install.sh | 28 - .../1-1-1/scripts/TOMCAT1_pkg_prepare.sh | 59 -- .../1-1-1/scripts/TOMCAT1_rubbosSL_configure.sh | 34 - .../1-1-1/scripts/TOMCAT1_rubbos_install.sh | 37 - .../1-1-1/scripts/TOMCAT1_rubbos_uninstall.sh | 19 - .../rubbos_scripts/1-1-1/scripts/TOMCAT1_stop.sh | 21 - .../1-1-1/scripts/TOMCAT1_uninstall.sh | 16 - .../1-1-1/scripts/check_service_status.sh | 19 - .../1-1-1/scripts/env_preparation.sh | 50 - .../rubbos_scripts/1-1-1/scripts/kill_all.sh | 22 - .../rubbos_scripts/1-1-1/scripts/manualCleanup.sh | 84 -- .../rubbos_scripts/1-1-1/scripts/reset_all.sh | 16 - .../rubbos/rubbos_scripts/1-1-1/scripts/run.sh | 153 --- .../rubbos_scripts/1-1-1/scripts/start_all.sh | 21 - .../rubbos_scripts/1-1-1/scripts/stop_all.sh | 18 - .../1-1-1/set_bottlenecks_rubbos_env.sh | 95 -- .../rubbos_scripts/1-1-1/sysstat_conf/CONFIG | 46 - testsuites/rubbos/run_rubbos.py | 478 --------- testsuites/rubbos/testsuite_story/rubbos_story1 | 1 - testsuites/rubbos/testsuite_story/rubbos_story2 | 2 - testsuites/vstf/run_vstf.py | 333 ------ testsuites/vstf/testcase_cfg/vstf_Ti1.yaml | 16 - testsuites/vstf/testcase_cfg/vstf_Ti2.yaml | 16 - testsuites/vstf/testcase_cfg/vstf_Ti3.yaml | 16 - testsuites/vstf/testcase_cfg/vstf_Tn1.yaml | 16 - testsuites/vstf/testcase_cfg/vstf_Tn2.yaml | 16 - testsuites/vstf/testcase_cfg/vstf_Tu1.yaml | 16 - testsuites/vstf/testcase_cfg/vstf_Tu2.yaml | 16 - testsuites/vstf/testcase_cfg/vstf_Tu3.yaml | 16 - .../vstf/testcase_cfg/vstf_heat_template.yaml | 261 ----- testsuites/vstf/testsuite_story/vstf_story1 | 1 - testsuites/vstf/testsuite_story/vstf_story2 | 1 - testsuites/vstf/vstf_collector.py | 80 -- testsuites/vstf/vstf_scripts/README.rst | 3 - testsuites/vstf/vstf_scripts/__init__.py | 8 - .../vstf/vstf_scripts/etc/vstf/amqp/amqp.ini | 9 - .../etc/vstf/default/reporters.html-settings | 22 - .../etc/vstf/default/reporters.mail.mail-settings | 21 - .../etc/vstf/default/sw_perf.tool-settings | 29 - testsuites/vstf/vstf_scripts/etc/vstf/env/Ti.json | 63 -- testsuites/vstf/vstf_scripts/etc/vstf/env/Tn.json | 36 - testsuites/vstf/vstf_scripts/etc/vstf/env/Tnv.json | 84 -- testsuites/vstf/vstf_scripts/etc/vstf/env/Tu.json | 70 -- .../vstf/vstf_scripts/etc/vstf/env/eth2eth.json | 16 - .../vstf/vstf_scripts/etc/vstf/env/images.json | 7 - testsuites/vstf/vstf_scripts/etc/vstf/env/src.json | 7 - .../vstf/vstf_scripts/etc/vstf/env/tester.json | 3 - .../etc/vstf/perf/sw_perf.batch-settings | 80 -- .../etc/vstf/perf/sw_perf.cpu-settings | 5 - .../etc/vstf/perf/sw_perf.device-settings | 56 - .../etc/vstf/perf/sw_perf.flownodes-settings | 99 -- .../etc/vstf/perf/sw_perf.forwarding-settings | 51 - .../etc/vstf/reporter/reporters.template-settings | 36 - .../vstf_scripts/etc/vstf/spirent/optimize.ini | 14 - .../vstf_scripts/etc/vstf/spirent/strategy.ini | 21 - .../etc/vstf/user/reporters.html-settings | 3 - .../etc/vstf/user/reporters.mail.mail-settings | 15 - .../etc/vstf/user/sw_perf.tool-settings | 2 - testsuites/vstf/vstf_scripts/install.sh | 51 - testsuites/vstf/vstf_scripts/pylint.conf | 280 ----- testsuites/vstf/vstf_scripts/requirements.txt | 13 - testsuites/vstf/vstf_scripts/setup.cfg | 77 -- testsuites/vstf/vstf_scripts/setup.py | 23 - testsuites/vstf/vstf_scripts/vstf/__init__.py | 8 - .../vstf/vstf_scripts/vstf/agent/__init__.py | 8 - testsuites/vstf/vstf_scripts/vstf/agent/agent.py | 144 --- .../vstf/vstf_scripts/vstf/agent/env/__init__.py | 8 - .../vstf_scripts/vstf/agent/env/basic/__init__.py | 8 - .../vstf_scripts/vstf/agent/env/basic/collect.py | 112 -- .../vstf/agent/env/basic/commandline.py | 56 - .../vstf/agent/env/basic/device_manager.py | 154 --- .../vstf/agent/env/basic/image_manager.py | 156 --- .../vstf/agent/env/basic/source_manager.py | 79 -- .../vstf_scripts/vstf/agent/env/basic/vm9pfs.py | 167 --- .../vstf/agent/env/basic/vm_manager.py | 237 ----- .../vstf/agent/env/basic/vm_xml_help.py | 84 -- .../vstf/vstf_scripts/vstf/agent/env/builder.py | 56 - .../vstf/agent/env/driver_plugins/__init__.py | 8 - .../vstf/agent/env/driver_plugins/manager.py | 46 - .../vstf/agent/env/driver_plugins/model.py | 42 - .../vstf/agent/env/driver_plugins/origin_driver.py | 50 - .../vstf/agent/env/fsmonitor/FSMonitor.py | 236 ----- .../vstf/agent/env/fsmonitor/__init__.py | 8 - .../vstf/agent/env/fsmonitor/constant.py | 21 - .../vstf_scripts/vstf/agent/env/fsmonitor/utils.py | 120 --- .../vstf/agent/env/plugins/__init__.py | 8 - .../vstf/agent/env/plugins/libvirt_plugin.py | 71 -- .../vstf_scripts/vstf/agent/env/plugins/model.py | 58 -- .../vstf/agent/env/plugins/tester_env_plugin.py | 47 - .../vstf/agent/env/vswitch_plugins/__init__.py | 8 - .../agent/env/vswitch_plugins/bridge_plugin.py | 74 -- .../vstf/agent/env/vswitch_plugins/manager.py | 37 - .../vstf/agent/env/vswitch_plugins/model.py | 67 -- .../vstf/agent/env/vswitch_plugins/ovs_plugin.py | 206 ---- .../vstf_scripts/vstf/agent/equalizer/__init__.py | 8 - .../vstf_scripts/vstf/agent/equalizer/equalizer.py | 78 -- .../vstf_scripts/vstf/agent/equalizer/get_info.py | 179 ---- .../vstf_scripts/vstf/agent/equalizer/optimize.py | 69 -- .../vstf/vstf_scripts/vstf/agent/perf/__init__.py | 8 - .../vstf/vstf_scripts/vstf/agent/perf/affctl.py | 20 - .../vstf/vstf_scripts/vstf/agent/perf/ethtool.py | 59 -- .../vstf/vstf_scripts/vstf/agent/perf/iperf.py | 165 --- .../vstf/vstf_scripts/vstf/agent/perf/netmap.py | 178 ---- .../vstf/vstf_scripts/vstf/agent/perf/netns.py | 109 -- .../vstf/vstf_scripts/vstf/agent/perf/netperf.py | 191 ---- .../vstf/vstf_scripts/vstf/agent/perf/pktgen.py | 162 --- .../vstf/vstf_scripts/vstf/agent/perf/qperf.py | 177 ---- .../vstf/vstf_scripts/vstf/agent/perf/sar.py | 88 -- .../vstf/vstf_scripts/vstf/agent/perf/utils.py | 48 - .../vstf/vstf_scripts/vstf/agent/perf/vnstat.py | 113 -- .../vstf/vstf_scripts/vstf/agent/perf/vstfperf.py | 111 -- .../vstf/vstf_scripts/vstf/agent/softagent.py | 139 --- .../vstf_scripts/vstf/agent/spirent/__init__.py | 8 - .../vstf_scripts/vstf/agent/spirent/spirent.py | 334 ------ .../vstf/vstf_scripts/vstf/agent/spirent/tools.py | 386 ------- .../vstf/vstf_scripts/vstf/agent/spirentagent.py | 17 - .../vstf/vstf_scripts/vstf/common/__init__.py | 8 - .../vstf/vstf_scripts/vstf/common/candy_text.py | 61 -- .../vstf/vstf_scripts/vstf/common/cfgparser.py | 32 - testsuites/vstf/vstf_scripts/vstf/common/check.py | 26 - .../vstf/vstf_scripts/vstf/common/cliutil.py | 37 - testsuites/vstf/vstf_scripts/vstf/common/cmds.py | 30 - .../vstf/vstf_scripts/vstf/common/constants.py | 76 -- testsuites/vstf/vstf_scripts/vstf/common/daemon.py | 162 --- .../vstf/vstf_scripts/vstf/common/decorator.py | 97 -- .../vstf/vstf_scripts/vstf/common/excepts.py | 22 - testsuites/vstf/vstf_scripts/vstf/common/input.py | 21 - testsuites/vstf/vstf_scripts/vstf/common/log.py | 53 - .../vstf/vstf_scripts/vstf/common/message.py | 150 --- .../vstf/vstf_scripts/vstf/common/perfmark.py | 23 - testsuites/vstf/vstf_scripts/vstf/common/pyhtml.py | 326 ------ testsuites/vstf/vstf_scripts/vstf/common/rsync.py | 568 ----------- .../vstf/vstf_scripts/vstf/common/saltstack.py | 211 ---- testsuites/vstf/vstf_scripts/vstf/common/ssh.py | 253 ----- .../vstf/vstf_scripts/vstf/common/test_func.py | 23 - testsuites/vstf/vstf_scripts/vstf/common/unix.py | 64 -- testsuites/vstf/vstf_scripts/vstf/common/utils.py | 264 ----- .../vstf/vstf_scripts/vstf/common/vstfcli.py | 74 -- .../vstf/vstf_scripts/vstf/controller/__init__.py | 8 - .../vstf_scripts/vstf/controller/api_server.py | 460 --------- .../vstf/controller/database/__init__.py | 8 - .../vstf/controller/database/constants.py | 63 -- .../vstf/controller/database/dbinterface.py | 718 ------------- .../vstf/controller/database/tables.py | 305 ------ .../vstf/controller/env_build/__init__.py | 8 - .../vstf/controller/env_build/cfg_intent_parse.py | 137 --- .../vstf/controller/env_build/env_build.py | 85 -- .../vstf/controller/env_build/env_collect.py | 40 - .../vstf/vstf_scripts/vstf/controller/fabricant.py | 80 -- .../vstf/controller/reporters/__init__.py | 8 - .../vstf/controller/reporters/mail/__init__.py | 8 - .../vstf/controller/reporters/mail/mail.py | 130 --- .../vstf/controller/reporters/mail/sendmail.py | 70 -- .../vstf/controller/reporters/report/__init__.py | 8 - .../controller/reporters/report/candy_generator.py | 142 --- .../controller/reporters/report/data_factory.py | 508 --------- .../controller/reporters/report/html/__init__.py | 8 - .../controller/reporters/report/html/html_base.py | 44 - .../reporters/report/html/htmlcreator.py | 88 -- .../controller/reporters/report/pdf/__init__.py | 8 - .../controller/reporters/report/pdf/element.py | 821 --------------- .../controller/reporters/report/pdf/pdfcreator.py | 131 --- .../controller/reporters/report/pdf/pdftemplate.py | 148 --- .../vstf/controller/reporters/report/pdf/story.py | 216 ---- .../vstf/controller/reporters/report/pdf/styles.py | 206 ---- .../reporters/report/provider/__init__.py | 8 - .../reporters/report/provider/html_provider.py | 49 - .../reporters/report/provider/pdf_provider.py | 53 - .../vstf/controller/reporters/reporter.py | 130 --- .../vstf/controller/res/Traffic-types.gif | Bin 160486 -> 0 bytes .../vstf/controller/res/Traffic-types.jpg | Bin 541886 -> 0 bytes .../vstf/controller/res/deployment/Ti-direct.gif | Bin 41247 -> 0 bytes .../vstf/controller/res/deployment/Ti-direct.jpg | Bin 147185 -> 0 bytes .../vstf/controller/res/deployment/Ti.gif | Bin 61062 -> 0 bytes .../vstf/controller/res/deployment/Ti.jpg | Bin 221926 -> 0 bytes .../vstf/controller/res/deployment/Tn.gif | Bin 57362 -> 0 bytes .../vstf/controller/res/deployment/Tn.jpg | Bin 213515 -> 0 bytes .../vstf/controller/res/deployment/Tnv.gif | Bin 89853 -> 0 bytes .../vstf/controller/res/deployment/Tnv.jpg | Bin 308215 -> 0 bytes .../vstf/controller/res/deployment/Tu.gif | Bin 56592 -> 0 bytes .../vstf/controller/res/deployment/Tu.jpg | Bin 183475 -> 0 bytes .../vstf/controller/res/iperf/Ti-3.gif | Bin 83575 -> 0 bytes .../vstf/controller/res/iperf/Ti-3.jpg | Bin 277597 -> 0 bytes .../vstf/vstf_scripts/vstf/controller/res/logo.jpg | Bin 4713 -> 0 bytes .../vstf/controller/res/pktgen/Ti-1.gif | Bin 71843 -> 0 bytes .../vstf/controller/res/pktgen/Ti-1.jpg | Bin 251078 -> 0 bytes .../vstf/controller/res/pktgen/Ti-2.gif | Bin 73543 -> 0 bytes .../vstf/controller/res/pktgen/Ti-2.jpg | Bin 249443 -> 0 bytes .../vstf/controller/res/pktgen/Ti-direct-1.gif | Bin 53683 -> 0 bytes .../vstf/controller/res/pktgen/Ti-direct-1.jpg | Bin 177600 -> 0 bytes .../vstf/controller/res/pktgen/Ti-direct-2.gif | Bin 51763 -> 0 bytes .../vstf/controller/res/pktgen/Ti-direct-2.jpg | Bin 183484 -> 0 bytes .../vstf/controller/res/pktgen/Tn-1.gif | Bin 66762 -> 0 bytes .../vstf/controller/res/pktgen/Tn-1.jpg | Bin 244190 -> 0 bytes .../vstf/controller/res/pktgen/Tn-1v.gif | Bin 93153 -> 0 bytes .../vstf/controller/res/pktgen/Tn-1v.jpg | Bin 327571 -> 0 bytes .../vstf/controller/res/pktgen/Tn-2.gif | Bin 77273 -> 0 bytes .../vstf/controller/res/pktgen/Tn-2.jpg | Bin 269108 -> 0 bytes .../vstf/controller/res/pktgen/Tn-2v.gif | Bin 103475 -> 0 bytes .../vstf/controller/res/pktgen/Tn-2v.jpg | Bin 353221 -> 0 bytes .../vstf/controller/res/pktgen/Tu-1.gif | Bin 67571 -> 0 bytes .../vstf/controller/res/pktgen/Tu-1.jpg | Bin 224490 -> 0 bytes .../vstf/controller/res/pktgen/Tu-2.gif | Bin 67834 -> 0 bytes .../vstf/controller/res/pktgen/Tu-2.jpg | Bin 224479 -> 0 bytes .../vstf/controller/res/pktgen/Tu-3.gif | Bin 74698 -> 0 bytes .../vstf/controller/res/pktgen/Tu-3.jpg | Bin 243850 -> 0 bytes .../vstf/controller/res/spirent/Tn-1.gif | Bin 53330 -> 0 bytes .../vstf/controller/res/spirent/Tn-1.jpg | Bin 207261 -> 0 bytes .../vstf/controller/res/spirent/Tn-1v.gif | Bin 76052 -> 0 bytes .../vstf/controller/res/spirent/Tn-1v.jpg | Bin 289977 -> 0 bytes .../vstf/controller/res/spirent/Tn-2.gif | Bin 53711 -> 0 bytes .../vstf/controller/res/spirent/Tn-2.jpg | Bin 210919 -> 0 bytes .../vstf/controller/res/spirent/Tn-2v.gif | Bin 72834 -> 0 bytes .../vstf/controller/res/spirent/Tn-2v.jpg | Bin 286486 -> 0 bytes .../vstf/controller/settings/__init__.py | 8 - .../vstf/controller/settings/cpu_settings.py | 82 -- .../vstf/controller/settings/device_settings.py | 22 - .../vstf/controller/settings/flows_settings.py | 157 --- .../controller/settings/forwarding_settings.py | 22 - .../vstf/controller/settings/html_settings.py | 61 -- .../vstf/controller/settings/mail_settings.py | 134 --- .../vstf/controller/settings/perf_settings.py | 118 --- .../vstf/controller/settings/settings.py | 346 ------- .../vstf/controller/settings/settings_input.py | 46 - .../vstf/controller/settings/template_settings.py | 23 - .../vstf/controller/settings/tester_settings.py | 23 - .../vstf/controller/settings/tool_settings.py | 103 -- .../vstf/controller/spirent/__init__.py | 8 - .../vstf/controller/spirent/appliance.py | 98 -- .../vstf/controller/spirent/common/__init__.py | 8 - .../vstf/controller/spirent/common/model.py | 548 ---------- .../controller/spirent/common/result_analysis.py | 184 ---- .../vstf/controller/sw_perf/__init__.py | 8 - .../vstf/controller/sw_perf/flow_producer.py | 146 --- .../vstf_scripts/vstf/controller/sw_perf/model.py | 205 ---- .../vstf/controller/sw_perf/perf_provider.py | 225 ---- .../vstf/controller/sw_perf/performance.py | 435 -------- .../vstf/controller/sw_perf/raw_data.py | 139 --- .../vstf/controller/unittest/__init__.py | 8 - .../vstf/controller/unittest/configuration.py | 21 - .../vstf_scripts/vstf/controller/unittest/model.py | 31 - .../controller/unittest/test_cfg_intent_parse.py | 37 - .../vstf/controller/unittest/test_collect.py | 55 - .../controller/unittest/test_driver_function.py | 35 - .../vstf/controller/unittest/test_env_build.py | 60 -- .../vstf/controller/unittest/test_perf.py | 130 --- .../vstf/controller/unittest/test_ssh.py | 34 - .../vstf/vstf_scripts/vstf/controller/vstfadm.py | 353 ------- .../vstf_scripts/vstf/rpc_frame_work/__init__.py | 8 - .../vstf_scripts/vstf/rpc_frame_work/constant.py | 22 - .../vstf/rpc_frame_work/rpc_consumer.py | 435 -------- .../vstf/rpc_frame_work/rpc_producer.py | 268 ----- utils/dashboard/rubbos_collector.py | 63 -- utils/dispatcher/__init__.py | 22 - utils/dispatcher/base.py | 42 - utils/dispatcher/file.py | 66 -- utils/dispatcher/func.py | 70 -- utils/dispatcher/http.py | 91 -- utils/infra_setup/README.rst | 68 -- utils/infra_setup/create_instances.sh | 32 - utils/infra_setup/index.rst | 30 - utils/infra_setup/passwordless_SSH/README.rst | 30 - .../passwordless_SSH/set_passwordless_ssh.sh | 60 -- utils/infra_setup/user_data/p-agent-user-data | 15 - utils/infra_setup/user_data/p-master-user-data | 14 - utils/infra_setup/vm_dev_setup/README.rst | 14 - utils/infra_setup/vm_dev_setup/common.sh | 70 -- utils/infra_setup/vm_dev_setup/package.conf | 14 - utils/infra_setup/vm_dev_setup/setup_env.sh | 140 --- utils/infra_setup/vm_dev_setup/vm_prepare_setup.sh | 26 - utils/mongodb/Mongodb_Ubuntu_install.sh | 32 - utils/monitor_setup/README.rst | 34 - utils/monitor_setup/index.rst | 30 - 367 files changed, 27333 deletions(-) delete mode 100755 ci/vstf_run.sh delete mode 100644 run_posca.sh delete mode 100644 testsuites/rubbos/puppet_manifests/internal/rubbos.conf delete mode 100755 testsuites/rubbos/puppet_manifests/internal/run_rubbos_internal.sh delete mode 100644 testsuites/rubbos/puppet_manifests/modules/params/manifests/rubbos_params.pp delete mode 100755 testsuites/rubbos/puppet_manifests/modules/rubbos_client/files/Makefile delete mode 100644 testsuites/rubbos/puppet_manifests/modules/rubbos_client/files/build.properties delete mode 100644 testsuites/rubbos/puppet_manifests/modules/rubbos_client/files/config.mk delete mode 100644 testsuites/rubbos/puppet_manifests/modules/rubbos_client/files/rubbos.properties.template delete mode 100755 testsuites/rubbos/puppet_manifests/modules/rubbos_client/files/run_emulator.sh delete mode 100644 testsuites/rubbos/puppet_manifests/modules/rubbos_client/manifests/rubbos_client_off.pp delete mode 100644 testsuites/rubbos/puppet_manifests/modules/rubbos_client/manifests/rubbos_client_on.pp delete mode 100644 testsuites/rubbos/puppet_manifests/modules/rubbos_common/manifests/rubbos_common_on.pp delete mode 100644 testsuites/rubbos/puppet_manifests/modules/rubbos_httpd/files/apache_conf/httpd.conf delete mode 100644 testsuites/rubbos/puppet_manifests/modules/rubbos_httpd/files/apache_conf/workers.properties delete mode 100644 testsuites/rubbos/puppet_manifests/modules/rubbos_httpd/manifests/rubbos_httpd_off.pp delete mode 100644 testsuites/rubbos/puppet_manifests/modules/rubbos_httpd/manifests/rubbos_httpd_on.pp delete mode 100644 testsuites/rubbos/puppet_manifests/modules/rubbos_monitor/manifests/rubbos_monitor_off.pp delete mode 100644 testsuites/rubbos/puppet_manifests/modules/rubbos_monitor/manifests/rubbos_monitor_on.pp delete mode 100755 testsuites/rubbos/puppet_manifests/modules/rubbos_mysql/files/prepare_rubbos_mysql_db.sh delete mode 100644 testsuites/rubbos/puppet_manifests/modules/rubbos_mysql/manifests/rubbos_mysql_off.pp delete mode 100644 testsuites/rubbos/puppet_manifests/modules/rubbos_mysql/manifests/rubbos_mysql_on.pp delete mode 100644 testsuites/rubbos/puppet_manifests/modules/rubbos_tomcat/files/tomcat_sl/build.properties delete mode 100644 testsuites/rubbos/puppet_manifests/modules/rubbos_tomcat/files/tomcat_sl/mysql.properties delete mode 100755 testsuites/rubbos/puppet_manifests/modules/rubbos_tomcat/files/tomcat_sl/rubbos_files/Makefile delete mode 100644 testsuites/rubbos/puppet_manifests/modules/rubbos_tomcat/files/tomcat_sl/rubbos_files/config.mk delete mode 100644 testsuites/rubbos/puppet_manifests/modules/rubbos_tomcat/manifests/rubbos_tomcat_off.pp delete mode 100644 testsuites/rubbos/puppet_manifests/modules/rubbos_tomcat/manifests/rubbos_tomcat_on.pp delete mode 100644 testsuites/rubbos/puppet_manifests/site_off.pp delete mode 100644 testsuites/rubbos/puppet_manifests/site_on.pp delete mode 100644 testsuites/rubbos/rubbos_scripts/1-1-1/apache_conf/httpd.conf delete mode 100644 testsuites/rubbos/rubbos_scripts/1-1-1/apache_conf/workers.properties_template delete mode 100644 testsuites/rubbos/rubbos_scripts/1-1-1/mysql_conf/my.cnf delete mode 100644 testsuites/rubbos/rubbos_scripts/1-1-1/nsFile.txt delete mode 100644 testsuites/rubbos/rubbos_scripts/1-1-1/rubbos_conf/Makefile delete mode 100644 testsuites/rubbos/rubbos_scripts/1-1-1/rubbos_conf/build.properties delete mode 100644 testsuites/rubbos/rubbos_scripts/1-1-1/rubbos_conf/config.mk delete mode 100644 testsuites/rubbos/rubbos_scripts/1-1-1/rubbos_conf/cpu_mem.sh delete mode 100644 testsuites/rubbos/rubbos_scripts/1-1-1/rubbos_conf/mysql.properties_template delete mode 100644 testsuites/rubbos/rubbos_scripts/1-1-1/rubbos_conf/rubbos-servletsBO.sh delete mode 100644 testsuites/rubbos/rubbos_scripts/1-1-1/rubbos_conf/rubbos-servletsRW.sh delete mode 100644 testsuites/rubbos/rubbos_scripts/1-1-1/rubbos_conf/rubbos.properties_template delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/BENCHMARK_configure.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/BENCHMARK_install.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/BENCHMARK_pkg_prepare.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/BENCHMARK_rubbos_install.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/BENCHMARK_rubbos_uninstall.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/BENCHMARK_uninstall.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT1_configure.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT1_install.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT1_pkg_prepare.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT1_rubbos_install.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT1_rubbos_uninstall.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT1_uninstall.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT2_configure.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT2_install.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT2_pkg_prepare.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT2_rubbos_install.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT2_rubbos_uninstall.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT2_uninstall.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT3_configure.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT3_install.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT3_pkg_prepare.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT3_rubbos_install.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT3_rubbos_uninstall.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT3_uninstall.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT4_configure.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT4_install.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT4_pkg_prepare.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT4_rubbos_install.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT4_rubbos_uninstall.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT4_uninstall.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CONTROL_checkScp_exec.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CONTROL_emulabConf_exec.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CONTROL_rubbos_exec.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/HTTPD_configure.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/HTTPD_ignition.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/HTTPD_install.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/HTTPD_pkg_prepare.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/HTTPD_rubbos_install.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/HTTPD_rubbos_uninstall.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/HTTPD_stop.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/HTTPD_uninstall.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/MYSQL1_configure.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/MYSQL1_ignition.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/MYSQL1_install.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/MYSQL1_pkg_prepare.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/MYSQL1_reset.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/MYSQL1_rubbos_install.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/MYSQL1_rubbos_uninstall.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/MYSQL1_stop.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/MYSQL1_uninstall.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/TOMCAT1_configure.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/TOMCAT1_ignition.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/TOMCAT1_install.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/TOMCAT1_pkg_prepare.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/TOMCAT1_rubbosSL_configure.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/TOMCAT1_rubbos_install.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/TOMCAT1_rubbos_uninstall.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/TOMCAT1_stop.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/TOMCAT1_uninstall.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/check_service_status.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/env_preparation.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/kill_all.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/manualCleanup.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/reset_all.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/run.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/start_all.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/scripts/stop_all.sh delete mode 100755 testsuites/rubbos/rubbos_scripts/1-1-1/set_bottlenecks_rubbos_env.sh delete mode 100644 testsuites/rubbos/rubbos_scripts/1-1-1/sysstat_conf/CONFIG delete mode 100755 testsuites/rubbos/run_rubbos.py delete mode 100755 testsuites/rubbos/testsuite_story/rubbos_story1 delete mode 100755 testsuites/rubbos/testsuite_story/rubbos_story2 delete mode 100755 testsuites/vstf/run_vstf.py delete mode 100644 testsuites/vstf/testcase_cfg/vstf_Ti1.yaml delete mode 100644 testsuites/vstf/testcase_cfg/vstf_Ti2.yaml delete mode 100644 testsuites/vstf/testcase_cfg/vstf_Ti3.yaml delete mode 100644 testsuites/vstf/testcase_cfg/vstf_Tn1.yaml delete mode 100644 testsuites/vstf/testcase_cfg/vstf_Tn2.yaml delete mode 100644 testsuites/vstf/testcase_cfg/vstf_Tu1.yaml delete mode 100644 testsuites/vstf/testcase_cfg/vstf_Tu2.yaml delete mode 100644 testsuites/vstf/testcase_cfg/vstf_Tu3.yaml delete mode 100644 testsuites/vstf/testcase_cfg/vstf_heat_template.yaml delete mode 100755 testsuites/vstf/testsuite_story/vstf_story1 delete mode 100755 testsuites/vstf/testsuite_story/vstf_story2 delete mode 100755 testsuites/vstf/vstf_collector.py delete mode 100644 testsuites/vstf/vstf_scripts/README.rst delete mode 100644 testsuites/vstf/vstf_scripts/__init__.py delete mode 100644 testsuites/vstf/vstf_scripts/etc/vstf/amqp/amqp.ini delete mode 100644 testsuites/vstf/vstf_scripts/etc/vstf/default/reporters.html-settings delete mode 100644 testsuites/vstf/vstf_scripts/etc/vstf/default/reporters.mail.mail-settings delete mode 100644 testsuites/vstf/vstf_scripts/etc/vstf/default/sw_perf.tool-settings delete mode 100644 testsuites/vstf/vstf_scripts/etc/vstf/env/Ti.json delete mode 100644 testsuites/vstf/vstf_scripts/etc/vstf/env/Tn.json delete mode 100644 testsuites/vstf/vstf_scripts/etc/vstf/env/Tnv.json delete mode 100644 testsuites/vstf/vstf_scripts/etc/vstf/env/Tu.json delete mode 100644 testsuites/vstf/vstf_scripts/etc/vstf/env/eth2eth.json delete mode 100644 testsuites/vstf/vstf_scripts/etc/vstf/env/images.json delete mode 100644 testsuites/vstf/vstf_scripts/etc/vstf/env/src.json delete mode 100644 testsuites/vstf/vstf_scripts/etc/vstf/env/tester.json delete mode 100644 testsuites/vstf/vstf_scripts/etc/vstf/perf/sw_perf.batch-settings delete mode 100644 testsuites/vstf/vstf_scripts/etc/vstf/perf/sw_perf.cpu-settings delete mode 100644 testsuites/vstf/vstf_scripts/etc/vstf/perf/sw_perf.device-settings delete mode 100644 testsuites/vstf/vstf_scripts/etc/vstf/perf/sw_perf.flownodes-settings delete mode 100644 testsuites/vstf/vstf_scripts/etc/vstf/perf/sw_perf.forwarding-settings delete mode 100644 testsuites/vstf/vstf_scripts/etc/vstf/reporter/reporters.template-settings delete mode 100644 testsuites/vstf/vstf_scripts/etc/vstf/spirent/optimize.ini delete mode 100644 testsuites/vstf/vstf_scripts/etc/vstf/spirent/strategy.ini delete mode 100644 testsuites/vstf/vstf_scripts/etc/vstf/user/reporters.html-settings delete mode 100644 testsuites/vstf/vstf_scripts/etc/vstf/user/reporters.mail.mail-settings delete mode 100644 testsuites/vstf/vstf_scripts/etc/vstf/user/sw_perf.tool-settings delete mode 100644 testsuites/vstf/vstf_scripts/install.sh delete mode 100644 testsuites/vstf/vstf_scripts/pylint.conf delete mode 100644 testsuites/vstf/vstf_scripts/requirements.txt delete mode 100644 testsuites/vstf/vstf_scripts/setup.cfg delete mode 100644 testsuites/vstf/vstf_scripts/setup.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/__init__.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/agent/__init__.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/agent/agent.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/agent/env/__init__.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/agent/env/basic/__init__.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/agent/env/basic/collect.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/agent/env/basic/commandline.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/agent/env/basic/device_manager.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/agent/env/basic/image_manager.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/agent/env/basic/source_manager.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/agent/env/basic/vm9pfs.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/agent/env/basic/vm_manager.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/agent/env/basic/vm_xml_help.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/agent/env/builder.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/agent/env/driver_plugins/__init__.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/agent/env/driver_plugins/manager.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/agent/env/driver_plugins/model.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/agent/env/driver_plugins/origin_driver.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/agent/env/fsmonitor/FSMonitor.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/agent/env/fsmonitor/__init__.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/agent/env/fsmonitor/constant.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/agent/env/fsmonitor/utils.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/agent/env/plugins/__init__.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/agent/env/plugins/libvirt_plugin.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/agent/env/plugins/model.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/agent/env/plugins/tester_env_plugin.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/agent/env/vswitch_plugins/__init__.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/agent/env/vswitch_plugins/bridge_plugin.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/agent/env/vswitch_plugins/manager.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/agent/env/vswitch_plugins/model.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/agent/env/vswitch_plugins/ovs_plugin.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/agent/equalizer/__init__.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/agent/equalizer/equalizer.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/agent/equalizer/get_info.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/agent/equalizer/optimize.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/agent/perf/__init__.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/agent/perf/affctl.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/agent/perf/ethtool.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/agent/perf/iperf.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/agent/perf/netmap.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/agent/perf/netns.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/agent/perf/netperf.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/agent/perf/pktgen.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/agent/perf/qperf.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/agent/perf/sar.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/agent/perf/utils.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/agent/perf/vnstat.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/agent/perf/vstfperf.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/agent/softagent.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/agent/spirent/__init__.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/agent/spirent/spirent.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/agent/spirent/tools.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/agent/spirentagent.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/common/__init__.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/common/candy_text.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/common/cfgparser.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/common/check.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/common/cliutil.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/common/cmds.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/common/constants.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/common/daemon.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/common/decorator.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/common/excepts.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/common/input.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/common/log.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/common/message.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/common/perfmark.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/common/pyhtml.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/common/rsync.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/common/saltstack.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/common/ssh.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/common/test_func.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/common/unix.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/common/utils.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/common/vstfcli.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/__init__.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/api_server.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/database/__init__.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/database/constants.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/database/dbinterface.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/database/tables.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/env_build/__init__.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/env_build/cfg_intent_parse.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/env_build/env_build.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/env_build/env_collect.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/fabricant.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/reporters/__init__.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/reporters/mail/__init__.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/reporters/mail/mail.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/reporters/mail/sendmail.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/reporters/report/__init__.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/reporters/report/candy_generator.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/reporters/report/data_factory.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/reporters/report/html/__init__.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/reporters/report/html/html_base.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/reporters/report/html/htmlcreator.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/reporters/report/pdf/__init__.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/reporters/report/pdf/element.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/reporters/report/pdf/pdfcreator.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/reporters/report/pdf/pdftemplate.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/reporters/report/pdf/story.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/reporters/report/pdf/styles.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/reporters/report/provider/__init__.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/reporters/report/provider/html_provider.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/reporters/report/provider/pdf_provider.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/reporters/reporter.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/res/Traffic-types.gif delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/res/Traffic-types.jpg delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/res/deployment/Ti-direct.gif delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/res/deployment/Ti-direct.jpg delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/res/deployment/Ti.gif delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/res/deployment/Ti.jpg delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/res/deployment/Tn.gif delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/res/deployment/Tn.jpg delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/res/deployment/Tnv.gif delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/res/deployment/Tnv.jpg delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/res/deployment/Tu.gif delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/res/deployment/Tu.jpg delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/res/iperf/Ti-3.gif delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/res/iperf/Ti-3.jpg delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/res/logo.jpg delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/res/pktgen/Ti-1.gif delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/res/pktgen/Ti-1.jpg delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/res/pktgen/Ti-2.gif delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/res/pktgen/Ti-2.jpg delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/res/pktgen/Ti-direct-1.gif delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/res/pktgen/Ti-direct-1.jpg delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/res/pktgen/Ti-direct-2.gif delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/res/pktgen/Ti-direct-2.jpg delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/res/pktgen/Tn-1.gif delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/res/pktgen/Tn-1.jpg delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/res/pktgen/Tn-1v.gif delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/res/pktgen/Tn-1v.jpg delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/res/pktgen/Tn-2.gif delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/res/pktgen/Tn-2.jpg delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/res/pktgen/Tn-2v.gif delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/res/pktgen/Tn-2v.jpg delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/res/pktgen/Tu-1.gif delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/res/pktgen/Tu-1.jpg delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/res/pktgen/Tu-2.gif delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/res/pktgen/Tu-2.jpg delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/res/pktgen/Tu-3.gif delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/res/pktgen/Tu-3.jpg delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/res/spirent/Tn-1.gif delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/res/spirent/Tn-1.jpg delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/res/spirent/Tn-1v.gif delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/res/spirent/Tn-1v.jpg delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/res/spirent/Tn-2.gif delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/res/spirent/Tn-2.jpg delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/res/spirent/Tn-2v.gif delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/res/spirent/Tn-2v.jpg delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/settings/__init__.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/settings/cpu_settings.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/settings/device_settings.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/settings/flows_settings.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/settings/forwarding_settings.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/settings/html_settings.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/settings/mail_settings.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/settings/perf_settings.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/settings/settings.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/settings/settings_input.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/settings/template_settings.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/settings/tester_settings.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/settings/tool_settings.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/spirent/__init__.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/spirent/appliance.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/spirent/common/__init__.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/spirent/common/model.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/spirent/common/result_analysis.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/sw_perf/__init__.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/sw_perf/flow_producer.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/sw_perf/model.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/sw_perf/perf_provider.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/sw_perf/performance.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/sw_perf/raw_data.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/unittest/__init__.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/unittest/configuration.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/unittest/model.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/unittest/test_cfg_intent_parse.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/unittest/test_collect.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/unittest/test_driver_function.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/unittest/test_env_build.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/unittest/test_perf.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/unittest/test_ssh.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/controller/vstfadm.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/rpc_frame_work/__init__.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/rpc_frame_work/constant.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/rpc_frame_work/rpc_consumer.py delete mode 100644 testsuites/vstf/vstf_scripts/vstf/rpc_frame_work/rpc_producer.py delete mode 100755 utils/dashboard/rubbos_collector.py delete mode 100644 utils/dispatcher/__init__.py delete mode 100644 utils/dispatcher/base.py delete mode 100644 utils/dispatcher/file.py delete mode 100644 utils/dispatcher/func.py delete mode 100644 utils/dispatcher/http.py delete mode 100644 utils/infra_setup/README.rst delete mode 100644 utils/infra_setup/create_instances.sh delete mode 100644 utils/infra_setup/index.rst delete mode 100644 utils/infra_setup/passwordless_SSH/README.rst delete mode 100755 utils/infra_setup/passwordless_SSH/set_passwordless_ssh.sh delete mode 100644 utils/infra_setup/user_data/p-agent-user-data delete mode 100644 utils/infra_setup/user_data/p-master-user-data delete mode 100644 utils/infra_setup/vm_dev_setup/README.rst delete mode 100644 utils/infra_setup/vm_dev_setup/common.sh delete mode 100644 utils/infra_setup/vm_dev_setup/package.conf delete mode 100755 utils/infra_setup/vm_dev_setup/setup_env.sh delete mode 100644 utils/infra_setup/vm_dev_setup/vm_prepare_setup.sh delete mode 100644 utils/mongodb/Mongodb_Ubuntu_install.sh delete mode 100644 utils/monitor_setup/README.rst delete mode 100644 utils/monitor_setup/index.rst diff --git a/ci/vstf_run.sh b/ci/vstf_run.sh deleted file mode 100755 index 41309676..00000000 --- a/ci/vstf_run.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -set -ex - -BOTTLENECKS_REPO=https://gerrit.opnfv.org/gerrit/bottlenecks - -SCRIPT_DIR=`cd ${BASH_SOURCE[0]%/*};pwd` -GERRIT_REFSPEC_DEBUG=$1 - -if [ x"$GERRIT_REFSPEC_DEBUG" != x ]; then - git fetch $BOTTLENECKS_REPO $GERRIT_REFSPEC_DEBUG && git checkout FETCH_HEAD -fi - -cd $SCRIPT_DIR/../utils/infra_setup/heat_template/vstf_heat_template/ -./vstf_HOT_create_instance.sh $GERRIT_REFSPEC_DEBUG -cd - - -set +ex diff --git a/run_posca.sh b/run_posca.sh deleted file mode 100644 index b47a220a..00000000 --- a/run_posca.sh +++ /dev/null @@ -1,54 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -pip install -U /home/opnfv/bottlenecks - -function check_testcase(){ - - check_suite="$1" - SUITE_PREFIX="/home/opnfv/bottlenecks/testsuites/posca/testcase_cfg" - - TEST_CASE=$2 - - #find all the test case yaml files first - find $SUITE_PREFIX -name "*yaml" > /tmp/all_testcases.yaml - all_testcases_insuite=`cat /tmp/all_testcases.yaml | awk -F '/' '{print $NF}' | awk -F '.' '{print $1}'` - all_testcases=(${all_testcases_insuite}) - - if [ "${TEST_CASE}" != "" ]; then - testcase_exec=(${TEST_CASE// /}) - for i in "${testcase_exec[@]}"; do - if [[ " ${all_testcases[*]} " != *" $i "* ]]; then - error "unknown test case: $i. available test cases are: ${all_test_cases[@]}" - fi - done - info "tests to execute: ${TEST_CASE}." - else - error "lack of testcase name" - fi -} - -SUITE_PREFIX="/home/opnfv/bottlenecks/testsuites/posca/testcase_cfg" -source /home/opnfv/bottlenecks/common.sh -test_file="/home/opnfv/bottlenecks/testsuites/posca/testsuite_story/posca_factor_test" -if [[ -f $test_file ]]; then - testcases=($(cat $test_file)) -else - error "no posca test suite file " -fi - -for i in "${testcases[@]}"; do - #check if the testcase is legal or not - check_testcase -posca $i - #adjust config parameters - #run test case - file=${SUITE_PREFIX}/${i}.yaml - python /home/opnfv/bottlenecks/testsuites/posca/run_posca.py -done diff --git a/testsuites/rubbos/puppet_manifests/internal/rubbos.conf b/testsuites/rubbos/puppet_manifests/internal/rubbos.conf deleted file mode 100644 index 937dae72..00000000 --- a/testsuites/rubbos/puppet_manifests/internal/rubbos.conf +++ /dev/null @@ -1,45 +0,0 @@ -############################################################################### -# Copyright (c) 2016 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - - -[Controller] -controller=REPLACED_CONTROLLER -#Example: -#controller=controller-name:controller_public_ip:controller_private_ip - -[Hosts] -client_servers=REPLACED_CLIENT_SERVERS -#Example: -#client_servers=rubbos-client1:client1_private_ip,rubbos-client2:client2_private_ip - -web_servers=REPLACED_WEB_SERVERS -#web_servers=rubbos-httpd1:httpd1_private_ip - -app_servers=REPLACED_APP_SERVERS -#app_servers=rubbos-tomcat1:tomcat1_private_ip - -cjdbc_controller=REPLACED_CJDBC_CONTROLLER -#cjdbc_controller= - -db_servers=REPLACED_DB_SERVERS -#db_servers=rubbos-mysql1:mysql1_private_ip - - -[Application] -database_port=3306 -db_username=rubbos -db_password=rubbos -clients_per_node=REPLACED_CLIENTS_PER_NODE -#clients_per_node=25 50 - - -[Folders] -rubbos_app=/bottlenecks/rubbos/app -rubbos_app_tools=/bottlenecks/rubbos/app_tools -rubbos_home=/bottlenecks/rubbos/app/RUBBoS diff --git a/testsuites/rubbos/puppet_manifests/internal/run_rubbos_internal.sh b/testsuites/rubbos/puppet_manifests/internal/run_rubbos_internal.sh deleted file mode 100755 index b08d2fb7..00000000 --- a/testsuites/rubbos/puppet_manifests/internal/run_rubbos_internal.sh +++ /dev/null @@ -1,403 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2016 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - - -## run_rubbos_interlnal.sh is executed in rubbos-controller -## Usage: run_rubbos_internal.sh rubbos.conf local_result_dir -if [ $# -ne 2 ];then - echo "Need Two argument!" - exit 1 -fi -local_cfg_path=$1 -local_results_dir=$2 -controller_host=`hostname` - -#REMOTE_GIT_REPO=git://git.opnfv.org/bottlenecks -REMOTE_GIT_REPO=https://gerrit.opnfv.org/gerrit/bottlenecks -REMOTE_ARTIFACTS_REPO=http://artifacts.opnfv.org/bottlenecks/rubbos/rubbos_files.tar.gz -LOCAL_GIT_REPO=/home/ubuntu/btnks-git -LOCAL_ARTIFACTS_REPO=/home/ubuntu/btnks-artifacts -LOCAL_RUBBOS_MANIFESTS_HOME=/home/ubuntu/btnks-git/bottlenecks/testsuites/rubbos/puppet_manifests -LOCAL_ARTIFACTS_RUBBOS_HOME=/home/ubuntu/btnks-artifacts/rubbos_files - -SSH_ARGS="-o StrictHostKeyChecking=no -o BatchMode=yes -i /home/ubuntu/.ssh/id_rsa" - -# conf properties from the input config file -client_servers= -web_servers= -app_servers= -cjdbc_controller= -database_servers= -database_port=3306 -db_username=rubbos -db_password=rubbos -clients_per_node= -rubbos_app= -rubbos_app_tools= -rubbos_home= - -# conf info used in this script -bench_client= -clients_arr= -remote_client_arr= -remote_client_servers= -clients_per_node_arr= -webservers_arr= -appservers_arr= -dbservers_arr= -all_agents_arr= -hostname_arr= -hostip_arr= - -# Other variables used in this script -class_nodes= - -read_conf() { - while read line - do - if [ ${#line} -gt 0 ] && [ ${line:0:1} != "#" ] && [ ${line:0:1} != "[" ];then - line=(${line//=/ }) - case ${line[0]} in - "controller" ) - e_arr=(${line[1]//:/ }) - controller_host=${e_arr[0]} - controller_ip=${e_arr[2]} - hostname_arr=("${hostname_arr[@]}" "${e_arr[0]}") - hostip_arr=("${hostip_arr[@]}" "${e_arr[2]}");; - "client_servers" ) - elems=(${line[1]//,/ }) - for e in "${elems[@]}";do - e_arr=(${e//:/ }) - client_servers=${client_servers}${e_arr[0]}"," - hostname_arr=("${hostname_arr[@]}" "${e_arr[0]}") - hostip_arr=("${hostip_arr[@]}" "${e_arr[1]}") - done - client_servers=${client_servers%,};; - "web_servers" ) - e_arr=(${line[1]//:/ }) - web_servers=${web_servers}${e_arr[0]}"," - hostname_arr=("${hostname_arr[@]}" "${e_arr[0]}") - hostip_arr=("${hostip_arr[@]}" "${e_arr[1]}") - web_servers=${e_arr[0]};; - "app_servers" ) - elems=(${line[1]//,/ }) - for e in "${elems[@]}";do - e_arr=(${e//:/ }) - app_servers=${app_servers}${e_arr[0]}"," - hostname_arr=("${hostname_arr[@]}" "${e_arr[0]}") - hostip_arr=("${hostip_arr[@]}" "${e_arr[1]}") - done - app_servers=${app_servers%,};; - "cjdbc_controller" ) - if [ "x"${line[1]} != "x" ]; then - e_arr=(${line[1]//:/ }) - hostname_arr=("${hostname_arr[@]}" "${e_arr[0]}") - hostip_arr=("${hostip_arr[@]}" "${e_arr[1]}") - cjdbc_controller=${e_arr[0]} - fi - ;; - "db_servers" ) - elems=(${line[1]//,/ }) - for e in "${elems[@]}";do - e_arr=(${e//:/ }) - database_servers=${database_servers}${e_arr[0]}"," - hostname_arr=("${hostname_arr[@]}" "${e_arr[0]}") - hostip_arr=("${hostip_arr[@]}" "${e_arr[1]}") - done - database_servers=${database_servers%,};; - "database_port" ) - database_port=${line[1]};; - "db_username" ) - db_username=${line[1]};; - "db_password" ) - db_password=${line[1]};; - "clients_per_node" ) - clients_per_node=${line[@]:1:${#line[@]-1}};; - "rubbos_app" ) - rubbos_app=${line[1]};; - "rubbos_app_tools" ) - rubbos_app_tools=${line[1]};; - "rubbos_home" ) - rubbos_home=${line[1]};; - esac - fi - done < $local_cfg_path - - clients_arr=(${client_servers//,/ }) - clients_per_node_arr=(${clients_per_node}) - webservers_arr=(${web_servers//,/ }) - appservers_arr=(${app_servers//,/ }) - dbservers_arr=(${database_servers//,/ }) - all_agents_arr=("${clients_arr[@]}" "${webservers_arr[@]}" "${appservers_arr[@]}" "${dbservers_arr[@]}") - bench_client=${clients_arr[0]} - len=${#clients_arr[@]} - if [ $len -gt 1 ]; then - remote_clients_arr=(${clients_arr[@]:1:$len-1}) - remote_client_servers=${client_servers#*,} - fi - - echo "-------------Main conf info:----------" - i=1 - while [ $i -lt ${#hostname_arr[@]} ]; do - echo ${hostip_arr[$i]}" "${hostname_arr[$i]} - let i=i+1 - done - echo "clients_arr: "${clients_arr[@]} - echo "bench_client: "$bench_client - echo "remote_client_servers: "$remote_client_servers - echo "remote_clients_arr: "${remote_clients_arr[@]} - echo "clients_per_node_arr: "${clients_per_node_arr[@]} - echo "webservers_arr: "${webservers_arr[@]} - echo "appservers_arr: "${appservers_arr[@]} - echo "dbservers_arr: "${dbservers_arr[@]} - echo "all agents: "${all_agents_arr[@]} -} - -fetch_remote_resources() { - if [ -d $LOCAL_GIT_REPO ];then - rm -rf $LOCAL_GIT_REPO - fi - mkdir -p $LOCAL_GIT_REPO - sudo apt-get update - sudo dpkg --configure -a - sudo rm /var/lib/apt/lists/lock - sudo rm /var/cache/apt/archives/lock - sudo apt-get install -y git - cd $LOCAL_GIT_REPO - git clone ${REMOTE_GIT_REPO} - - if [ -d $LOCAL_ARTIFACTS_REPO ];then - rm -rf $LOCAL_ARTIFACTS_REPO - fi - mkdir -p $LOCAL_ARTIFACTS_REPO - cd $LOCAL_ARTIFACTS_REPO - wget -nv ${REMOTE_ARTIFACTS_REPO} - tar xvzf rubbos_files.tar.gz - - if [ -d $local_results_dir ];then - rm -rf $local_results_dir - fi - mkdir -p $local_results_dir -} - -# ssh all vms/instances once only after first creation -direct_ssh() { - echo "127.0.0.1 $(hostname)" >> /etc/hosts - echo "write hosts file: 127.0.0.1 $(hostname)" - cp /home/ubuntu/bottlenecks_key /home/ubuntu/.ssh/id_rsa - sudo chmod 0600 /home/ubuntu/.ssh/id_rsa - echo 'StrictHostKeyChecking no' > /home/ubuntu/.ssh/config - sudo chown -R ubuntu:ubuntu /home/ubuntu/.ssh - i=1 - while [ $i -lt ${#hostip_arr[@]} ]; do - echo ${hostip_arr[$i]}" "${hostname_arr[$i]} >> /etc/hosts - let i=i+1 - done - echo "Done controller." - - i=1 - while [ $i -lt ${#hostip_arr[@]} ]; do - if [ ${hostname_arr[$i]} == ${controller_host} ];then - let i=i+1 - continue - fi - echo "Processing: "${hostip_arr[$i]}" "${hostname_arr[$i]} - echo "ssh *sudo hostname* test:" - ssh ${SSH_ARGS} ubuntu@${hostip_arr[$i]} "sudo hostname" - - ssh ${SSH_ARGS} ubuntu@${hostip_arr[$i]} "sudo cp /etc/hosts /home/ubuntu/ && sudo chmod 646 /home/ubuntu/hosts" - ssh ${SSH_ARGS} ubuntu@${hostip_arr[$i]} "echo 127.0.0.1 ${hostname_arr[$i]} >> /home/ubuntu/hosts" - j=1 - while [ $j -lt ${#hostip_arr[@]} ];do - local host_item=${hostip_arr[$j]}" "${hostname_arr[$j]} - ssh ${SSH_ARGS} ubuntu@${hostip_arr[$i]} "echo ${host_item} >> /home/ubuntu/hosts" - let j=j+1 - done - ssh ${SSH_ARGS} ubuntu@${hostip_arr[$i]} "sudo chmod 644 /home/ubuntu/hosts && sudo cp /home/ubuntu/hosts /etc/ && sudo rm -rf /home/ubuntu/hosts" - echo "done hosts" - - sudo ssh ${SSH_ARGS} ubuntu@${hostip_arr[$i]} "echo 'StrictHostKeyChecking no' > /home/ubuntu/.ssh/config" - sudo scp ${SSH_ARGS} /home/ubuntu/.ssh/id_rsa ubuntu@${hostip_arr[$i]}:/home/ubuntu/.ssh/ - - let i=i+1 - done -} - -start_puppet_service() { - # Start puppetserver - sudo service puppetserver stop - sudo service puppetserver start - sudo service puppetserver status - # Start all puppet agents - for host in "${all_agents_arr[@]}";do - echo "start puppet agent on:"${host} - ssh ${SSH_ARGS} ubuntu@${host} "sudo service puppet status" - ssh ${SSH_ARGS} ubuntu@${host} "sudo service puppet stop" - ssh ${SSH_ARGS} ubuntu@${host} "sudo service puppet start --no-client" - ssh ${SSH_ARGS} ubuntu@${host} "sudo service puppet status" - done - - sudo puppet cert list --all - sudo puppet cert sign --all - sudo puppet cert list --all -} - -# inline function -# It requires one local file path which needs to be replaced -_replace_text() { - echo "_replace file: "$1 - sed -i 's#REPLACED_RUBBOS_APP_TOOLS#'${rubbos_app_tools}'#g' $1 - sed -i 's#REPLACED_RUBBOS_APP#'${rubbos_app}'#g' $1 - sed -i 's#REPLACED_RUBBOS_HOME#'${rubbos_home}'#g' $1 - local mysql_jdbc_url="jdbc:mysql://"${database_servers}":"${database_port}"/rubbos" - sed -i 's#REPLACED_MYSQL_JDBC_DB_URL#'${mysql_jdbc_url}'#g' $1 - sed -i 's/REPLACED_MYSQL_USERNAME/'${db_username}'/g' $1 - sed -i 's/REPLACED_MYSQL_PASSWORD/'${db_password}'/g' $1 - handler_details= - handlers= - i=0 - while [ $i -lt ${#appservers_arr} ];do - handler_name="s"$i - handlers=${handlers}${handler_name}"," - handler_details=${handler_details}"worker."${handler_name}".port=8009\n" - handler_details=${handler_details}"worker."${handler_name}".host="${appservers_arr[$i]}"\n" - handler_details=${handler_details}"worker."${handler_name}".type=ajp13\n" - handler_details=${handler_details}"worker."${handler_name}".lbfactor=1\n" - let i=i+1 - done - handlers=${handlers%,} - sed -i 's/REPLACED_HANDLERS_DETAILS/'${handler_details}'/g' $1 - sed -i 's/REPLACED_HANDLERS/'${handlers}'/g' $1 - - sed -i 's/REPLACED_WEB_SERVER/'${web_servers}'/g' $1 - sed -i 's/REPLACED_APPLICATION_SERVER/'${app_servers}'/g' $1 - sed -i 's/REPLACED_DB_SERVER/'${database_servers}'/g' $1 - sed -i 's/REPLACED_CLIENT_SERVERS/'${remote_client_servers}'/g' $1 -} - -# inline function -# it requires one input string -_to_puppet_class_nodes() { - echo "_to_puppet_class_nodes "$1 - class_nodes= - nodes_arr=(${1//,/ }) - i=0 - while [ $i -lt ${#nodes_arr[@]} ];do - class_nodes=${class_nodes}"'"${nodes_arr[$i]}"'," - let i=i+1 - done - class_nodes=${class_nodes%,} -} - -# inline function -_execute_catalog() { - for host in "${clients_arr[@]}"; do - ssh ${SSH_ARGS} ubuntu@${host} 'sudo puppet agent -t' & - done - for host in "${webservers_arr[@]}"; do - ssh ${SSH_ARGS} ubuntu@${host} 'sudo puppet agent -t' - done - for host in "${appservers_arr[@]}"; do - ssh ${SSH_ARGS} ubuntu@${host} 'sudo puppet agent -t' - done - for host in "${dbservers_arr[@]}"; do - ssh ${SSH_ARGS} ubuntu@${host} 'sudo puppet agent -t' - done -} - -prepare_manifests() { - # copy manifests - sudo cp -r ${LOCAL_RUBBOS_MANIFESTS_HOME}/modules/* /etc/puppet/modules/ - - # copy rubbos_files - sudo cp -r ${LOCAL_ARTIFACTS_RUBBOS_HOME}/modules/* /etc/puppet/modules/ - - # adjust corresponding configuration files (pre-catalog) - _replace_text /etc/puppet/modules/rubbos_tomcat/files/tomcat_sl/build.properties - _replace_text /etc/puppet/modules/rubbos_tomcat/files/tomcat_sl/Config.java - _replace_text /etc/puppet/modules/rubbos_tomcat/files/tomcat_sl/mysql.properties - _replace_text /etc/puppet/modules/rubbos_httpd/files/apache_conf/workers.properties - _replace_text /etc/puppet/modules/rubbos_httpd/files/apache_conf/httpd.conf - _replace_text /etc/puppet/modules/rubbos_client/files/build.properties - _replace_text /etc/puppet/modules/rubbos_client/files/rubbos.properties.template - _replace_text /etc/puppet/modules/rubbos_client/files/run_emulator.sh -} - -execute_catalog() { - # start all (exec catalog) - if [ "x"$1 == "xstart" ];then - echo "--> Start to execute catalogs in all agents..." - sudo cp ${LOCAL_RUBBOS_MANIFESTS_HOME}/site_on.pp /etc/puppet/manifests/site.pp - _execute_catalog - echo "--> Finish to execute catalogs in all agents." - elif [ "x"$1 == "xclean" ];then - echo "--> Cleanup all agents..." - sudo cp ${LOCAL_RUBBOS_MANIFESTS_HOME}/site_off.pp /etc/puppet/manifests/site.pp - _execute_catalog - echo "--> Finish to cleanup all agents." - fi -} - -run_emulator() { - # prepare data in db servers - for host in "${dbservers_arr[@]}"; do - ssh ${SSH_ARGS} ubuntu@${host} 'sudo scp ubuntu@'${controller_host}':/etc/puppet/modules/rubbos_mysql/files/rubbos_data_sql.tar.gz '${rubbos_home}'' - ssh ${SSH_ARGS} ubuntu@${host} 'cd '${rubbos_home}' && sudo ./prepare_rubbos_mysql_db.sh ./rubbos_data_sql.tar.gz ./rubbos_data_sql_dir' - done - - # run emulator.sh ( Modify rubbos.properties file first) - ssh ${SSH_ARGS} ubuntu@${bench_client} 'sudo rm -rf '${rubbos_home}'/bench/bench' - for x in "${clients_per_node_arr[@]}";do - echo "run emulator with clients_per_node="$x - for host in "${clients_arr[@]}";do - ssh ${SSH_ARGS} ubuntu@${host} "sed -e 's/REPLACED_NUMBER_OF_CLIENTS_PER_NODE/'${x}'/g' '${rubbos_home}'/Client/rubbos.properties.template > '${rubbos_home}'/Client/rubbos.properties " - done - ssh ${SSH_ARGS} ubuntu@${bench_client} 'cd '${rubbos_home}'/bench && ./run_emulator.sh' - done -} - -collect_results() { - # collect results, from bench_host to controller - scp ${SSH_ARGS} -r ubuntu@${bench_client}:${rubbos_home}/bench/bench/* ${local_results_dir} -} - -process_results() { - # post-process results and push to the database of dashboard - python ${LOCAL_GIT_REPO}/bottlenecks/utils/dashboard/process_data.py -i ${local_results_dir} \ - -c ${LOCAL_GIT_REPO}/bottlenecks/utils/dashboard/dashboard.yaml \ - -s rubbos \ - -o ${local_results_dir}/rubbos.out \ - -u no -} - -main() { - echo "==> read_conf:" - read_conf - echo "==> fetch_remote_resources:" - fetch_remote_resources - echo "==> direct_ssh:" - direct_ssh - echo "==> start_puppet_service:" - start_puppet_service - echo "==> prepare_manifests:" - prepare_manifests - echo "==> execute_catalog start:" - execute_catalog start - echo "==> run_emulator:" - run_emulator - echo "==> collect_results (to controller:${local_results_dir}):" - collect_results - echo "==> process_results:" - process_results - echo "==> execute_catalog clean:" - execute_catalog clean -} - -main diff --git a/testsuites/rubbos/puppet_manifests/modules/params/manifests/rubbos_params.pp b/testsuites/rubbos/puppet_manifests/modules/params/manifests/rubbos_params.pp deleted file mode 100644 index b9072316..00000000 --- a/testsuites/rubbos/puppet_manifests/modules/params/manifests/rubbos_params.pp +++ /dev/null @@ -1,23 +0,0 @@ -############################################################################## -# Copyright (c) 2016 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - - -## Variables used in {rubbos} test suite -class params::rubbos_params { - - $rubbos_app = "/bottlenecks/rubbos/app" - $rubbos_app_tools = "/bottlenecks/rubbos/app_tools" - $rubbos_home = "/bottlenecks/rubbos/app/RUBBoS" - $mysql_user_group = "mysql" - $mysql_user_name = "mysql" - $mysql_user_password = "mysql" - $rubbos_os_username = "ubuntu" - $rubbos_os_usergroup = "ubuntu" - -} diff --git a/testsuites/rubbos/puppet_manifests/modules/rubbos_client/files/Makefile b/testsuites/rubbos/puppet_manifests/modules/rubbos_client/files/Makefile deleted file mode 100755 index 77dec805..00000000 --- a/testsuites/rubbos/puppet_manifests/modules/rubbos_client/files/Makefile +++ /dev/null @@ -1,86 +0,0 @@ -############################################################################# -# Copyright (c) 2016 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - - -########################### -# RUBBoS Makefile # -########################### - -include config.mk - -############################## -# Environment variables # -############################## - -JAVA = $(JAVA_HOME)/bin/java -JAVAC = $(JAVA_HOME)/bin/javac -JAVACOPTS = -deprecation -JAVACC = $(JAVAC) $(JAVACOPTS) -RMIC = $(JAVA_HOME)/bin/rmic -RMIREGISTRY= $(JAVA_HOME)/bin/rmiregistry -CLASSPATH = .:$(J2EE_HOME)/lib/j2ee.jar:$(JAVA_HOME)/jre/lib/rt.jar -JAVADOC = $(JAVA_HOME)/javadoc - - -######################### -# Servlets version # -######################### -#ServletPrinter -Servlets = Config TimeManagement BrowseCategories Auth RegisterUser RubbosHttpServlet BrowseRegions SearchItemsByCategory SearchItemsByRegion ViewItem ViewBidHistory ViewUserInfo SellItemForm RegisterItem PutCommentAuth PutComment StoreComment BuyNowAuth BuyNow StoreBuyNow PutBidAuth PutBid StoreBid AboutMe - -all_servlets_sources = $(addprefix edu/rice/rubbos/servlets/, $(addsuffix .java, $(Servlets))) -all_servlets_obj = $(addprefix edu/rice/rubbos/servlets/, $(addsuffix .class, $(Servlets))) - -servlets: $(all_servlets_obj) - -clean_servlets: - rm -f edu/rice/rubbos/servlets/*.class - -#################### -# Client # -#################### - -ClientFiles = URLGenerator URLGeneratorPHP RUBBoSProperties Stats \ - TransitionTable ClientEmulator UserSession - -all_client_sources = $(addprefix edu/rice/rubbos/client/, $(addsuffix .java, $(ClientFiles))) -all_client_obj = $(addprefix edu/rice/rubbos/client/, $(addsuffix .class, $(ClientFiles))) edu/rice/rubbos/beans/TimeManagement.class - -client: $(all_client_obj) - -initDB: - ${JAVA} -classpath .:./database edu.rice.rubbos.client.InitDB ${PARAM} - -emulator: - ${JAVA} -classpath Client:Client/rubbos_client.jar:. -Xms256m -Xmx2048m -Dhttp.keepAlive=true -Dhttp.maxConnections=1000000 edu.rice.rubbos.client.ClientEmulator - -emulatorDebug: - ${JAVA} -classpath Client:Client/rubbos_client.jar:. -Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n -Xms128m -Xmx1024m -Dhttp.keepAlive=true -Dhttp.maxConnections=1000000 edu.rice.rubbos.client.ClientEmulator - - -############################ -# Global rules # -############################ - - -all: beans ejb_servlets client javadoc flush_cache - -world: all servlets - -javadoc : - ${JAVADOC} -d ./doc/api -bootclasspath ${CLASSPATH} -version -author -windowtitle "RUBBoS API" -header "RUBBoS (C)2001 Rice University/INRIA
" edu.rice.rubbos.beans edu.rice.rubbos.beans.servlets edu.rice.rubbos.client - -clean: - rm -f core edu/rice/rubbos/beans/*.class edu/rice/rubbos/beans/JOnAS* edu/rice/rubbos/beans/servlets/*.class edu/rice/rubbos/client/*.class edu/rice/rubbos/servlets/*.class - -%.class: %.java - ${JAVACC} -classpath ${CLASSPATH} $< - -flush_cache: bench/flush_cache.c - gcc bench/flush_cache.c -o bench/flush_cache diff --git a/testsuites/rubbos/puppet_manifests/modules/rubbos_client/files/build.properties b/testsuites/rubbos/puppet_manifests/modules/rubbos_client/files/build.properties deleted file mode 100644 index 77de8ba3..00000000 --- a/testsuites/rubbos/puppet_manifests/modules/rubbos_client/files/build.properties +++ /dev/null @@ -1,16 +0,0 @@ -############################################################################# -# Copyright (c) 2016 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - - -src = . -dist =. -classes.dir = ./build -web.dir = ../Servlet_HTML - -j2ee = REPLACED_RUBBOS_APP_TOOLS/j2sdkee1.3.1 diff --git a/testsuites/rubbos/puppet_manifests/modules/rubbos_client/files/config.mk b/testsuites/rubbos/puppet_manifests/modules/rubbos_client/files/config.mk deleted file mode 100644 index 407bc25d..00000000 --- a/testsuites/rubbos/puppet_manifests/modules/rubbos_client/files/config.mk +++ /dev/null @@ -1,36 +0,0 @@ -############################################################################# -# Copyright (c) 2016 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -## Environment variables -JAVA = $(JAVA_HOME)/bin/java -JAVAC = $(JAVA_HOME)/bin/javac -JAVACOPTS = -deprecation -JAVACC = $(JAVAC) $(JAVACOPTS) -RMIC = $(JAVA_HOME)/bin/rmic -RMIREGISTRY= $(JAVA_HOME)/bin/rmiregistry -CLASSPATH = .:$(J2EE_HOME)/lib/j2ee.jar:$(JAVA_HOME)/jre/lib/rt.jar:$(CATALINA_HOME)/common/lib/servlet-api.jar -JAVADOC = $(JAVA_HOME)/bin/javadoc -JAR = $(JAVA_HOME)/bin/jar - -GENIC = ${JONAS_ROOT}/bin/unix/GenIC - -MAKE = gmake -CP = /bin/cp -RM = /bin/rm -MKDIR = /bin/mkdir - - -# EJB server: supported values are jonas or jboss -EJB_SERVER = jonas - -# DB server: supported values are MySQL or PostgreSQL -DB_SERVER = MySQL - -%.class: %.java - ${JAVACC} -classpath ${CLASSPATH} $< diff --git a/testsuites/rubbos/puppet_manifests/modules/rubbos_client/files/rubbos.properties.template b/testsuites/rubbos/puppet_manifests/modules/rubbos_client/files/rubbos.properties.template deleted file mode 100644 index 33aa46e9..00000000 --- a/testsuites/rubbos/puppet_manifests/modules/rubbos_client/files/rubbos.properties.template +++ /dev/null @@ -1,85 +0,0 @@ -############################################################################# -# Copyright (c) 2016 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - - -# HTTP server information -httpd_hostname = REPLACED_WEB_SERVER -httpd_port = 8000 - -# C/JDBC server to monitor (if any) -cjdbc_hostname = - -# Precise which version to use. Valid options are : PHP, Servlets, EJB -httpd_use_version = Servlets - -# EJB server information -ejb_server = -ejb_html_path = -ejb_script_path = - -# Servlets server information -servlets_server = REPLACED_APPLICATION_SERVER -servlets_html_path = /rubbos -servlets_script_path = /rubbos/servlet - -# PHP information -php_html_path = /PHP -php_script_path = /PHP - -#Database information -database_master_server = REPLACED_DB_SERVER - -database_slave_servers = -workload_remote_client_nodes = REPLACED_CLIENT_SERVERS -workload_remote_client_command = REPLACED_RUBBOS_APP_TOOLS/jdk1.6.0_27/bin/java -classpath .:REPLACED_RUBBOS_HOME/Client/:REPLACED_RUBBOS_HOME/Client/rubbos_client.jar -Xms512m -Xmx2048m -Dhttp.keepAlive=true -Dhttp.maxConnections=1000000 edu.rice.rubbos.client.ClientEmulator - -workload_number_of_clients_per_node = REPLACED_NUMBER_OF_CLIENTS_PER_NODE - -# Workload: precise which transition table to use -workload_user_transition_table = REPLACED_RUBBOS_HOME/workload/user_transitions.txt -workload_author_transition_table = REPLACED_RUBBOS_HOME/workload/author_transitions.txt -workload_number_of_columns = 24 -workload_number_of_rows = 26 -workload_maximum_number_of_transitions = 1000 -workload_use_tpcw_think_time = yes -workload_number_of_stories_per_page = 20 - -workload_up_ramp_time_in_ms = 15000 -workload_up_ramp_slowdown_factor = 2 - -workload_session_run_time_in_ms = 60000 - -workload_down_ramp_time_in_ms = 10000 -workload_down_ramp_slowdown_factor = 3 -workload_percentage_of_author = 10 - -# Users policy -database_number_of_authors = 50 -database_number_of_users = 500000 - -# Stories policy -database_story_dictionnary = REPLACED_RUBBOS_HOME/database/dictionary -database_story_maximum_length = 1024 -database_oldest_story_year = 1998 -database_oldest_story_month = 1 - -# Comments policy -database_comment_max_length = 1024 - -# Connection timedout settings -connection_time_out_interval = 300 - -# Monitoring Information -monitoring_debug_level = 1 -monitoring_program = REPLACED_RUBBOS_APP/sysstat-9.0.6/bin/sar -monitoring_options = -u ALL -I SUM -monitoring_sampling_in_seconds = 1 -monitoring_rsh = /usr/bin/ssh -monitoring_scp = /usr/bin/scp -monitoring_gnuplot_terminal = png diff --git a/testsuites/rubbos/puppet_manifests/modules/rubbos_client/files/run_emulator.sh b/testsuites/rubbos/puppet_manifests/modules/rubbos_client/files/run_emulator.sh deleted file mode 100755 index 5e8a6e95..00000000 --- a/testsuites/rubbos/puppet_manifests/modules/rubbos_client/files/run_emulator.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2016 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -## Usage: run_emulator.sh -echo "==> Rubbos emulator start $(date)" - -REPLACED_RUBBOS_APP_TOOLS/jdk1.6.0_27/bin/java -classpath .:REPLACED_RUBBOS_HOME/Client:REPLACED_RUBBOS_HOME/Client/rubbos_client.jar -Xms512m -Xmx2048m -Dhttp.keepAlive=true -Dhttp.maxConnections=1000000 edu.rice.rubbos.client.ClientEmulator - -echo "==> Rubbos emulator end $(date)" diff --git a/testsuites/rubbos/puppet_manifests/modules/rubbos_client/manifests/rubbos_client_off.pp b/testsuites/rubbos/puppet_manifests/modules/rubbos_client/manifests/rubbos_client_off.pp deleted file mode 100644 index aeb1f12f..00000000 --- a/testsuites/rubbos/puppet_manifests/modules/rubbos_client/manifests/rubbos_client_off.pp +++ /dev/null @@ -1,103 +0,0 @@ -############################################################################# -# Copyright (c) 2016 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - - -class rubbos_client::rubbos_client_off { - - include params::rubbos_params - - # Declare some variables - $rubbos_home = $params::rubbos_params::rubbos_home - - # build.properties - file {'${rubbos_home}/build.properties': - ensure => absent, - path => "${rubbos_home}/build.properties", - show_diff => false, - backup => false, - } - - # config.mk - file {'${rubbos_home}/config.mk': - ensure => absent, - path => "${rubbos_home}/config.mk", - show_diff => false, - backup => false, - } - - # Makefile - file {'${rubbos_home}/Makefile': - ensure => absent, - path => "${rubbos_home}/Makefile", - show_diff => false, - backup => false, - } - - # Client/rubbos.properties.template - file {'${rubbos_home}/Client/rubbos.properties.template': - ensure => absent, - path => "${rubbos_home}/Client/rubbos.properties.template", - show_diff => false, - backup => false, - } - - # bench/run_emulator.sh - file {'${rubbos_home}/bench/run_emulator.sh': - ensure => absent, - path => "${rubbos_home}/bench/run_emulator.sh", - show_diff => false, - backup => false, - } - - file {'${rubbos_home}/Client.tar.gz': - ensure => absent, - path => "${rubbos_home}/Client.tar.gz", - backup => false, - } - - file {'${rubbos_home}/Client': - ensure => absent, - path => "${rubbos_home}/Client", - force => true, - recurse => true, - show_diff => false, - backup => false, - } - - file {'${rubbos_home}/workload.tar.gz': - ensure => absent, - path => "${rubbos_home}/workload.tar.gz", - backup => false, - } - - file {'${rubbos_home}/workload': - ensure => absent, - path => "${rubbos_home}/workload", - force => true, - recurse => true, - show_diff => false, - backup => false, - } - - file {'${rubbos_home}/database.tar.gz': - ensure => absent, - path => "${rubbos_home}/database.tar.gz", - backup => false, - } - - file {'${rubbos_home}/database': - ensure => absent, - path => "${rubbos_home}/database", - force => true, - recurse => true, - show_diff => false, - backup => false, - } - -} diff --git a/testsuites/rubbos/puppet_manifests/modules/rubbos_client/manifests/rubbos_client_on.pp b/testsuites/rubbos/puppet_manifests/modules/rubbos_client/manifests/rubbos_client_on.pp deleted file mode 100644 index 7cda7e14..00000000 --- a/testsuites/rubbos/puppet_manifests/modules/rubbos_client/manifests/rubbos_client_on.pp +++ /dev/null @@ -1,179 +0,0 @@ -############################################################################# -# Copyright (c) 2016 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - - -class rubbos_client::rubbos_client_on { - - include params::rubbos_params - require rubbos_common::rubbos_common_on - require rubbos_monitor::rubbos_monitor_on - - # Declare some variables - $rubbos_app_tools = $params::rubbos_params::rubbos_app_tools - $rubbos_home = $params::rubbos_params::rubbos_home - $rubbos_os_username = $params::rubbos_params::rubbos_os_username - $rubbos_os_usergroup = $params::rubbos_params::rubbos_os_usergroup - - # Prepare needed tools - file {'${rubbos_app_tools}/j2sdkee1.3.1.jar.gz': - ensure => file, - path => "${rubbos_app_tools}/j2sdkee1.3.1.jar.gz", - source => "puppet:///modules/rubbos_common/j2sdkee1.3.1.jar.gz", - backup => false, - } - - exec {'tar xzvf ${rubbos_app_tools}/j2sdkee1.3.1.jar.gz': - cwd => "${rubbos_app_tools}", - command => "tar xzvf ${rubbos_app_tools}/j2sdkee1.3.1.jar.gz", - path => ["/bin","/sbin","/usr/bin","/usr/sbin","/usr/local/bin","/usr/local/sbin"], - require => File['${rubbos_app_tools}/j2sdkee1.3.1.jar.gz'], - } - - file {'${rubbos_app_tools}/apache-ant-1.6.5.tar.gz': - ensure => file, - path => "${rubbos_app_tools}/apache-ant-1.6.5.tar.gz", - source => "puppet:///modules/rubbos_common/apache-ant-1.6.5.tar.gz", - backup => false, - } - - exec {'tar xzvf ${rubbos_app_tools}/apache-ant-1.6.5.tar.gz': - cwd => "${rubbos_app_tools}", - command => "tar xzvf ${rubbos_app_tools}/apache-ant-1.6.5.tar.gz", - path => ["/bin","/sbin","/usr/bin","/usr/sbin","/usr/local/bin","/usr/local/sbin"], - require => File['${rubbos_app_tools}/apache-ant-1.6.5.tar.gz'], - } - - # Prepare client codes and files - file {'${rubbos_home}/Client.tar.gz': - ensure => file, - path => "${rubbos_home}/Client.tar.gz", - source => "puppet:///modules/rubbos_client/Client.tar.gz", - backup => false, - } - - exec {'tar xvzf ${rubbos_home}/Client.tar.gz': - cwd => "${rubbos_home}", - command => "tar xvzf ${rubbos_home}/Client.tar.gz", - path => ["/bin","/sbin","/usr/bin","/usr/sbin","/usr/local/bin","/usr/local/sbin"], - require => File['${rubbos_home}/Client.tar.gz'], - } - - file {'${rubbos_home}/workload.tar.gz': - ensure => file, - path => "${rubbos_home}/workload.tar.gz", - source => "puppet:///modules/rubbos_client/workload.tar.gz", - backup => false, - } - - exec {'tar xvzf ${rubbos_home}/workload.tar.gz': - cwd => "${rubbos_home}", - command => "tar xvzf ${rubbos_home}/workload.tar.gz", - path => ["/bin","/sbin","/usr/bin","/usr/sbin","/usr/local/bin","/usr/local/sbin"], - require => File['${rubbos_home}/workload.tar.gz'], - } - - file {'${rubbos_home}/database.tar.gz': - ensure => file, - path => "${rubbos_home}/database.tar.gz", - source => "puppet:///modules/rubbos_client/database.tar.gz", - backup => false, - } - - exec {'tar xvzf ${rubbos_home}/database.tar.gz': - cwd => "${rubbos_home}", - command => "tar xvzf ${rubbos_home}/database.tar.gz", - path => ["/bin","/sbin","/usr/bin","/usr/sbin","/usr/local/bin","/usr/local/sbin"], - require => File['${rubbos_home}/database.tar.gz'], - } - - # build.properties - file {'${rubbos_home}/build.properties': - ensure => file, - path => "${rubbos_home}/build.properties", - source => "puppet:///modules/rubbos_client/build.properties", - show_diff => false, - backup => false, - } - - # config.mk - file {'${rubbos_home}/config.mk': - ensure => file, - path => "${rubbos_home}/config.mk", - source => "puppet:///modules/rubbos_client/config.mk", - show_diff => false, - backup => false, - } - - # Makefile - file {'${rubbos_home}/Makefile': - ensure => file, - path => "${rubbos_home}/Makefile", - source => "puppet:///modules/rubbos_client/Makefile", - show_diff => false, - backup => false, - } - - # Client/rubbos.properties.template - file {'${rubbos_home}/Client/rubbos.properties.template': - ensure => file, - path => "${rubbos_home}/Client/rubbos.properties.template", - source => "puppet:///modules/rubbos_client/rubbos.properties.template", - show_diff => false, - backup => false, - require => Exec['tar xvzf ${rubbos_home}/Client.tar.gz'], - } - - # bench/executable scripts - file {'${rubbos_home}/bench/run_emulator.sh': - ensure => file, - path => "${rubbos_home}/bench/run_emulator.sh", - source => "puppet:///modules/rubbos_client/run_emulator.sh", - backup => false, - } - - # Build rubbos_client.jar - exec {'ant clean': - cwd => "${rubbos_home}/Client", - command => "${rubbos_app_tools}/apache-ant-1.6.5/bin/ant clean", - environment => ["JAVA_HOME=${rubbos_app_tools}/jdk1.6.0_27","ANT_HOME=${rubbos_app_tools}/apache-ant-1.6.5"], - path => [ - "/bin","/sbin","/usr/bin","/usr/sbin","/usr/local/bin","/usr/local/sbin", - "${rubbos_app_tools}/jdk1.6.0_27/bin", - "${rubbos_app_tools}/jdk1.6.0_27/jre/bin", - "${rubbos_app_tools}/apache-ant-1.6.5/bin"], - require => [ - Exec['tar xzvf ${rubbos_app_tools}/j2sdkee1.3.1.jar.gz'], - Exec['tar xzvf ${rubbos_app_tools}/apache-ant-1.6.5.tar.gz'], - File['${rubbos_home}/build.properties'], - File['${rubbos_home}/Makefile'], - File['${rubbos_home}/config.mk'], - Exec['tar xvzf ${rubbos_home}/Client.tar.gz']], - } - - exec {'ant jar': - cwd => "${rubbos_home}/Client", - command => "${rubbos_app_tools}/apache-ant-1.6.5/bin/ant jar", - environment => ["JAVA_HOME=${rubbos_app_tools}/jdk1.6.0_27","ANT_HOME=${rubbos_app_tools}/apache-ant-1.6.5"], - path => [ - "/bin","/sbin","/usr/bin","/usr/sbin","/usr/local/bin","/usr/local/sbin", - "${rubbos_app_tools}/jdk1.6.0_27/bin", - "${rubbos_app_tools}/jdk1.6.0_27/jre/bin", - "${rubbos_app_tools}/apache-ant-1.6.5/bin"], - subscribe => Exec['ant clean'], - } - - # Change owner and group for the Client folder - exec {'chown -R ${rubbos_os_username}:${rubbos_os_usergroup} ${rubbos_home}/Client': - cwd => "${rubbos_home}", - command => "chown -R ${rubbos_os_username}:${rubbos_os_usergroup} ${rubbos_home}/Client", - path => ["/bin","/sbin","/usr/bin","/usr/sbin","/usr/local/bin","/usr/local/sbin"], - require => Exec['ant jar'], - } - -} diff --git a/testsuites/rubbos/puppet_manifests/modules/rubbos_common/manifests/rubbos_common_on.pp b/testsuites/rubbos/puppet_manifests/modules/rubbos_common/manifests/rubbos_common_on.pp deleted file mode 100644 index ca192f73..00000000 --- a/testsuites/rubbos/puppet_manifests/modules/rubbos_common/manifests/rubbos_common_on.pp +++ /dev/null @@ -1,72 +0,0 @@ -############################################################################## -# Copyright (c) 2016 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - - -class rubbos_common::rubbos_common_on { - - include params::rubbos_params - - # Declare some variables - $rubbos_app = $params::rubbos_params::rubbos_app - $rubbos_app_tools = $params::rubbos_params::rubbos_app_tools - $rubbos_home = $params::rubbos_params::rubbos_home - - # Prepare RUBBOS_APP folder - exec {'mkdir -p ${rubbos_app}': - command => "mkdir -p ${rubbos_app}", - unless => "test -d ${rubbos_app}", - path => ["/bin","/sbin","/usr/bin","/usr/sbin","/usr/local/bin","/usr/local/sbin"], - } - - # Prepare RUBBOS_APP_TOOLS folder - exec {'mkdir -p ${rubbos_app_tools}': - command => "mkdir -p ${rubbos_app_tools}", - unless => "test -d ${rubbos_app_tools}", - path => ["/bin","/sbin","/usr/bin","/usr/sbin","/usr/local/bin","/usr/local/sbin"], - } - - # Prepare RUBBOS_HOME folder - exec {'mkdir -p ${rubbos_home}': - command => "mkdir -p ${rubbos_home}", - unless => "test -d ${rubbos_home}", - path => ["/bin","/sbin","/usr/bin","/usr/sbin","/usr/local/bin","/usr/local/sbin"], - require => Exec['mkdir -p ${rubbos_app}'], - } - - # Prepare common packages: - package {'make': - name => "make", - ensure => installed, - } - package {'gcc': - name => "gcc", - ensure => installed, - } - package {'g++': - name => "g++", - ensure => installed, - } - - # Install jdk - file {'${rubbos_app_tools}/jdk-6u27-linux-x64.bin': - ensure => file, - path => "${rubbos_app_tools}/jdk-6u27-linux-x64.bin", - source => "puppet:///modules/rubbos_common/jdk-6u27-linux-x64.bin", - mode => 0711, - backup => false, - require => Exec['mkdir -p ${rubbos_app_tools}'], - } - exec {'jdk-6u27-linux-x64.bin': - cwd => "${rubbos_app_tools}", - command => "${rubbos_app_tools}/jdk-6u27-linux-x64.bin", - path => ["/bin","/sbin","/usr/bin","/usr/sbin","/usr/local/bin","/usr/local/sbin"], - require => File['${rubbos_app_tools}/jdk-6u27-linux-x64.bin'], - } - -} diff --git a/testsuites/rubbos/puppet_manifests/modules/rubbos_httpd/files/apache_conf/httpd.conf b/testsuites/rubbos/puppet_manifests/modules/rubbos_httpd/files/apache_conf/httpd.conf deleted file mode 100644 index 88c62581..00000000 --- a/testsuites/rubbos/puppet_manifests/modules/rubbos_httpd/files/apache_conf/httpd.conf +++ /dev/null @@ -1,324 +0,0 @@ -############################################################################# -# Copyright (c) 2016 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - - -ServerRoot "REPLACED_RUBBOS_APP_TOOLS/apache2" - - - - - - - - - - - - -PidFile logs/httpd.pid - - -Timeout 5 -KeepAlive Off -MaxKeepAliveRequests 100 -KeepAliveTimeout 15 - - -StartServers 5 -MinSpareServers 5 -MaxSpareServers 10 -ServerLimit 4000 -MaxClients 4000 -MaxRequestsPerChild 0 - - - -ServerLimit 200 -ThreadLimit 300 -StartServers 1 -MaxClients 300 -MinSpareThreads 5 -MaxSpareThreads 50 -ThreadsPerChild 150 -MaxRequestsPerChild 0 - - - -NumServers 5 -StartThreads 5 -MinSpareThreads 5 -MaxSpareThreads 10 -MaxThreadsPerChild 20 -MaxRequestsPerChild 0 - - - -ThreadsPerChild 250 -MaxRequestsPerChild 0 - - - -StartThreads 10 -MaxClients 50 -MaxRequestsPerThread 10000 - - - -ThreadStackSize 65536 -StartThreads 250 -MinSpareThreads 25 -MaxSpareThreads 250 -MaxThreads 1000 -MaxRequestsPerChild 0 -MaxMemFree 100 - - - -StartServers 2 -MinSpareThreads 5 -MaxSpareThreads 10 -MaxRequestsPerChild 0 - - -Listen 8000 - - - -User apache -Group apache - - - -ServerAdmin you@example.com - -UseCanonicalName Off - -DocumentRoot "REPLACED_RUBBOS_APP_TOOLS/apache2/htdocs" - - - Options FollowSymLinks - AllowOverride None - - - - Options Indexes FollowSymLinks - AllowOverride None - Order allow,deny - Allow from all - - -UserDir public_html -DirectoryIndex index.html index.html.var -AccessFileName .htaccess - - Order allow,deny - Deny from all - - -TypesConfig conf/mime.types -DefaultType text/plain - - - MIMEMagicFile conf/magic - - -HostnameLookups Off - -ErrorLog logs/error_log -LogLevel warn -LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined -LogFormat "%h %l %u %t \"%r\" %>s %b" common -LogFormat "%{Referer}i -> %U" referer -LogFormat "%{User-agent}i" agent -CustomLog logs/access_log common - -ServerTokens Full -ServerSignature On -Alias /icons/ "REPLACED_RUBBOS_APP_TOOLS/apache2/icons/" - - - Options Indexes MultiViews - AllowOverride None - Order allow,deny - Allow from all - - -AliasMatch ^/manual(?:/(?:de|en|es|fr|ja|ko|ru))?(/.*)?$ "REPLACED_RUBBOS_APP_TOOLS/apache2/manual$1" - - - Options Indexes - AllowOverride None - Order allow,deny - Allow from all - - - SetHandler type-map - - - SetEnvIf Request_URI ^/manual/(de|en|es|fr|ja|ko|ru)/ prefer-language=$1 - RedirectMatch 301 ^/manual(?:/(de|en|es|fr|ja|ko|ru)){2,}(/.*)?$ /manual/$1$2 - - -ScriptAlias /cgi-bin/ "REPLACED_RUBBOS_APP_TOOLS/apache2/cgi-bin/" - - - - - - AllowOverride None - Options None - Order allow,deny - Allow from all - - -IndexOptions FancyIndexing VersionSort -AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip - -AddIconByType (TXT,/icons/text.gif) text/* -AddIconByType (IMG,/icons/image2.gif) image/* -AddIconByType (SND,/icons/sound2.gif) audio/* -AddIconByType (VID,/icons/movie.gif) video/* - -AddIcon /icons/binary.gif .bin .exe -AddIcon /icons/binhex.gif .hqx -AddIcon /icons/tar.gif .tar -AddIcon /icons/world2.gif .wrl .wrl.gz .vrml .vrm .iv -AddIcon /icons/compressed.gif .Z .z .tgz .gz .zip -AddIcon /icons/a.gif .ps .ai .eps -AddIcon /icons/layout.gif .html .shtml .htm .pdf -AddIcon /icons/text.gif .txt -AddIcon /icons/c.gif .c -AddIcon /icons/p.gif .pl .py -AddIcon /icons/f.gif .for -AddIcon /icons/dvi.gif .dvi -AddIcon /icons/uuencoded.gif .uu -AddIcon /icons/script.gif .conf .sh .shar .csh .ksh .tcl -AddIcon /icons/tex.gif .tex -AddIcon /icons/bomb.gif core - -AddIcon /icons/back.gif .. -AddIcon /icons/hand.right.gif README -AddIcon /icons/folder.gif ^^DIRECTORY^^ -AddIcon /icons/blank.gif ^^BLANKICON^^ - -DefaultIcon /icons/unknown.gif - -ReadmeName README.html -HeaderName HEADER.html - -IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t -AddLanguage ca .ca -AddLanguage cs .cz .cs -AddLanguage da .dk -AddLanguage de .de -AddLanguage el .el -AddLanguage en .en -AddLanguage eo .eo -AddLanguage es .es -AddLanguage et .et -AddLanguage fr .fr -AddLanguage he .he -AddLanguage hr .hr -AddLanguage it .it -AddLanguage ja .ja -AddLanguage ko .ko -AddLanguage ltz .ltz -AddLanguage nl .nl -AddLanguage nn .nn -AddLanguage no .no -AddLanguage pl .po -AddLanguage pt .pt -AddLanguage pt-BR .pt-br -AddLanguage ru .ru -AddLanguage sv .sv -AddLanguage zh-CN .zh-cn -AddLanguage zh-TW .zh-tw - -LanguagePriority en ca cs da de el eo es et fr he hr it ja ko ltz nl nn no pl pt pt-BR ru sv zh-CN zh-TW -ForceLanguagePriority Prefer Fallback -AddCharset ISO-8859-1 .iso8859-1 .latin1 -AddCharset ISO-8859-2 .iso8859-2 .latin2 .cen -AddCharset ISO-8859-3 .iso8859-3 .latin3 -AddCharset ISO-8859-4 .iso8859-4 .latin4 -AddCharset ISO-8859-5 .iso8859-5 .latin5 .cyr .iso-ru -AddCharset ISO-8859-6 .iso8859-6 .latin6 .arb -AddCharset ISO-8859-7 .iso8859-7 .latin7 .grk -AddCharset ISO-8859-8 .iso8859-8 .latin8 .heb -AddCharset ISO-8859-9 .iso8859-9 .latin9 .trk -AddCharset ISO-2022-JP .iso2022-jp .jis -AddCharset ISO-2022-KR .iso2022-kr .kis -AddCharset ISO-2022-CN .iso2022-cn .cis -AddCharset Big5 .Big5 .big5 -# For russian, more than one charset is used (depends on client, mostly): -AddCharset WINDOWS-1251 .cp-1251 .win-1251 -AddCharset CP866 .cp866 -AddCharset KOI8-r .koi8-r .koi8-ru -AddCharset KOI8-ru .koi8-uk .ua -AddCharset ISO-10646-UCS-2 .ucs2 -AddCharset ISO-10646-UCS-4 .ucs4 -AddCharset UTF-8 .utf8 -AddCharset GB2312 .gb2312 .gb -AddCharset utf-7 .utf7 -AddCharset utf-8 .utf8 -AddCharset big5 .big5 .b5 -AddCharset EUC-TW .euc-tw -AddCharset EUC-JP .euc-jp -AddCharset EUC-KR .euc-kr -AddCharset shift_jis .sjis - -AddType application/x-compress .Z -AddType application/x-gzip .gz .tgz -AddHandler type-map var - -BrowserMatch "Mozilla/2" nokeepalive -BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0 -BrowserMatch "RealPlayer 4\.0" force-response-1.0 -BrowserMatch "Java/1\.0" force-response-1.0 -BrowserMatch "JDK/1\.0" force-response-1.0 - -BrowserMatch "Microsoft Data Access Internet Publishing Provider" redirect-carefully -BrowserMatch "^WebDrive" redirect-carefully -BrowserMatch "^WebDAVFS/1.[012]" redirect-carefully -BrowserMatch "^gnome-vfs" redirect-carefully - - Include conf/ssl.conf - - - -LoadModule jk_module "REPLACED_RUBBOS_APP_TOOLS/apache2/modules/mod_jk.so" - -# Where to find workers.properties -JkWorkersFile REPLACED_RUBBOS_APP_TOOLS/apache2/conf/workers.properties - -# Where to put jk logs -JkLogFile REPLACED_RUBBOS_APP_TOOLS/apache2/logs/mod_jk.log - -# Set the jk log level [debug/error/info] -JkLogLevel info - -# Select the log format -JkLogStampFormat "[%a %b %d %H:%M:%S %Y] " - -# JkOptions indicate to send SSL KEY SIZE, -JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories - -# JkRequestLogFormat set the request format -JkRequestLogFormat "%w %V %T" - -# Globally deny access to the WEB-INF directory - - AllowOverride None - deny from all - - -#Important: which requrests will be reouted to app server -JkMount /*/servlet/* worker1 -JkMount /*.jsp worker1 - -ServerName localhost diff --git a/testsuites/rubbos/puppet_manifests/modules/rubbos_httpd/files/apache_conf/workers.properties b/testsuites/rubbos/puppet_manifests/modules/rubbos_httpd/files/apache_conf/workers.properties deleted file mode 100644 index cdf0a783..00000000 --- a/testsuites/rubbos/puppet_manifests/modules/rubbos_httpd/files/apache_conf/workers.properties +++ /dev/null @@ -1,64 +0,0 @@ -############################################################################# -# Copyright (c) 2016 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - - -# workers.properties -# -# This file provides jk derived plugins with the needed information to -# connect to the different tomcat workers. Note that the distributed -# version of this file requires modification before it is usable by a -# plugin. -# - -# workers.tomcat_home should point to the location where you -# installed tomcat. This is where you have your conf, webapps and lib -# directories. -workers.tomcat_home=REPLACED_RUBBOS_APP_TOOLS/apache-tomcat-5.5.17 - -# workers.java_home should point to your Java installation. Normally -# you should have a bin and lib directories beneath it. -workers.java_home=REPLACED_RUBBOS_APP_TOOLS/jdk1.6.0_27 - -# You should configure your environment slash... ps=\ on NT and / on UNIX -# and maybe something different elsewhere. -ps=/ - - -# The workers that your plugins should create and work with -worker.list=worker1 - -# Here, it can be declared multiple session handlers, such as s1, s2 -REPLACED_HANDLERS_DETAILS -# examples: -#worker.s1.port=8009 -#worker.s1.host=btnks-2 -#worker.s1.type=ajp13 -#worker.s1.lbfactor=1 - -worker.worker1.type=lb -worker.worker1.balance_workers=REPLACED_HANDLERS -# example: -#worker.worker1.balance_workers=s1 -worker.worker1.sticky_session=True -worker.worker1.method=Session - -# Defining a worker named inprocess and of type jni -# Note that the name and the type do not have to match. -worker.inprocess.type=jni - -# Additional class path components. -worker.inprocess.class_path=$(workers.tomcat_home)$(ps)lib$(ps)tomcat.jar - -# Setting the command line for tomcat. -# Note: The cmd_line string may not contain spaces. -worker.inprocess.cmd_line=start - -worker.inprocess.jvm_lib=$(workers.java_home)$(ps)jre$(ps)lib$(ps)i386$(ps)server$(ps)libjvm.so -worker.inprocess.stdout=$(workers.tomcat_home)$(ps)logs$(ps)inprocess.stdout -worker.inprocess.stderr=$(workers.tomcat_home)$(ps)logs$(ps)inprocess.stderr diff --git a/testsuites/rubbos/puppet_manifests/modules/rubbos_httpd/manifests/rubbos_httpd_off.pp b/testsuites/rubbos/puppet_manifests/modules/rubbos_httpd/manifests/rubbos_httpd_off.pp deleted file mode 100644 index 5d5f3839..00000000 --- a/testsuites/rubbos/puppet_manifests/modules/rubbos_httpd/manifests/rubbos_httpd_off.pp +++ /dev/null @@ -1,85 +0,0 @@ -############################################################################# -# Copyright (c) 2016 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - - -class rubbos_httpd::rubbos_httpd_off { - - include params::rubbos_params - - # Declare some variables - $rubbos_app_tools = $params::rubbos_params::rubbos_app_tools - - # Ensure apache2 service is stopped - service {'stop apache http server': - ensure => stopped, - hasstatus => false, - status => "ps aux | grep 'bin/httpd.*start$'", - start => "${rubbos_app_tools}/apache2/bin/apachectl -f ${rubbos_app_tools}/apache2/conf/httpd.conf -k start", - stop => "${rubbos_app_tools}/apache2/bin/apachectl -f ${rubbos_app_tools}/apache2/conf/httpd.conf -k stop", - } - - # delete directory - file {'${rubbos_app_tools}/httpd-2.0.64.tar.gz': - ensure => absent, - path => "${rubbos_app_tools}/httpd-2.0.64.tar.gz", - force => true, - backup => false, - } - - file {'${rubbos_app_tools}/httpd-2.0.64': - ensure => absent, - path => "${rubbos_app_tools}/httpd-2.0.64", - force => true, - recurse => true, - backup => false, - require => Service['stop apache http server'], - } - - file {'${rubbos_app_tools}/tomcat-connectors-1.2.32-src.tar.gz': - ensure => absent, - path => "${rubbos_app_tools}/tomcat-connectors-1.2.32-src.tar.gz", - force => true, - backup => false, - } - - file {'${rubbos_app_tools}/tomcat-connectors-1.2.32-src': - ensure => absent, - path => "${rubbos_app_tools}/tomcat-connectors-1.2.32-src", - force => true, - recurse => true, - backup => false, - require => Service['stop apache http server'], - } - - # Delete apache2 directory - exec {'rm -rf ${rubbos_app_tools}/apache2': - cwd => "${rubbos_app_tools}/", - command => "rm -rf ${rubbos_app_tools}/apache2", - path => ["/bin","/sbin","/usr/bin","/usr/sbin","/usr/local/bin","/usr/local/sbin"], - onlyif => "test -d ${rubbos_app_tools}/apache2", - } - - # delete user and group - user {'apache': - name => "apache", - ensure => absent, - groups => "apache", - password => "apache", - require => [ - File['${rubbos_app_tools}/httpd-2.0.64'], - File['${rubbos_app_tools}/tomcat-connectors-1.2.32-src'], - Exec['rm -rf ${rubbos_app_tools}/apache2']], - } - group {'apache': - name => "apache", - ensure => absent, - require => User['apache'], - } - -} diff --git a/testsuites/rubbos/puppet_manifests/modules/rubbos_httpd/manifests/rubbos_httpd_on.pp b/testsuites/rubbos/puppet_manifests/modules/rubbos_httpd/manifests/rubbos_httpd_on.pp deleted file mode 100644 index cddbe34d..00000000 --- a/testsuites/rubbos/puppet_manifests/modules/rubbos_httpd/manifests/rubbos_httpd_on.pp +++ /dev/null @@ -1,159 +0,0 @@ -############################################################################# -# Copyright (c) 2016 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - - -class rubbos_httpd::rubbos_httpd_on { - - include params::rubbos_params - require rubbos_common::rubbos_common_on - - # Declare some variables - $rubbos_app_tools = $params::rubbos_params::rubbos_app_tools - - # Prepare apache2 directory - exec {'mkdir ${rubbos_app_tools}/apache2': - command => "mkdir -p ${rubbos_app_tools}/apache2", - creates => "${rubbos_app_tools}/apache2", - path => ["/bin","/sbin","/usr/bin","/usr/sbin","/usr/local/bin","/usr/local/sbin"], - } - - # Prepare packages - file {'${rubbos_app_tools}/httpd-2.0.64.tar.gz': - ensure => present, - path => "${rubbos_app_tools}/httpd-2.0.64.tar.gz", - source => "puppet:///modules/rubbos_httpd/httpd-2.0.64.tar.gz", - } - - exec {'tar xzvf ${rubbos_app_tools}/httpd-2.0.64.tar.gz': - cwd => "${rubbos_app_tools}", - command => "tar xzvf ${rubbos_app_tools}/httpd-2.0.64.tar.gz", - path => ["/bin","/sbin","/usr/bin","/usr/sbin","/usr/local/bin","/usr/local/sbin"], - subscribe => File['${rubbos_app_tools}/httpd-2.0.64.tar.gz'], - refreshonly => true, - } - - file {'${rubbos_app_tools}/tomcat-connectors-1.2.32-src.tar.gz': - ensure => present, - path => "${rubbos_app_tools}/tomcat-connectors-1.2.32-src.tar.gz", - source => "puppet:///modules/rubbos_httpd/tomcat-connectors-1.2.32-src.tar.gz", - } - - exec {'tar xzvf ${rubbos_app_tools}/tomcat-connectors-1.2.32-src.tar.gz': - cwd => "${rubbos_app_tools}", - command => "tar xzvf ${rubbos_app_tools}/tomcat-connectors-1.2.32-src.tar.gz", - path => ["/bin","/sbin","/usr/bin","/usr/sbin","/usr/local/bin","/usr/local/sbin"], - subscribe => File['${rubbos_app_tools}/tomcat-connectors-1.2.32-src.tar.gz'], - refreshonly => true - } - - # Add user and group - group {'apache': - name => "apache", - ensure => present, - before => User['apache'], - } - user {'apache': - name => "apache", - ensure => present, - groups => "apache", - password => "apache", - before => Exec['${rubbos_app_tools}/httpd-2.0.64/configure'], - } - - # Install apache http server - exec {'${rubbos_app_tools}/httpd-2.0.64/configure': - cwd => "${rubbos_app_tools}/httpd-2.0.64", - command => "${rubbos_app_tools}/httpd-2.0.64/configure --prefix=${rubbos_app_tools}/apache2 --enable-module=so --enable-so --with-mpm=worker", - path => ["/bin","/sbin","/usr/bin","/usr/sbin","/usr/local/bin","/usr/local/sbin"], - subscribe => Exec['tar xzvf ${rubbos_app_tools}/httpd-2.0.64.tar.gz'], - refreshonly => true, - } - - exec {'make httpd': - cwd => "${rubbos_app_tools}/httpd-2.0.64", - command => "make", - path => ["/bin","/sbin","/usr/bin","/usr/sbin","/usr/local/bin","/usr/local/sbin"], - subscribe => Exec['${rubbos_app_tools}/httpd-2.0.64/configure'], - refreshonly => true, - } - - exec {'make install httpd': - cwd => "${rubbos_app_tools}/httpd-2.0.64", - command => "make install", - path => ["/bin","/sbin","/usr/bin","/usr/sbin","/usr/local/bin","/usr/local/sbin"], - subscribe => Exec['make httpd'], - refreshonly => true, - } - - # Install mod jk - exec {'${rubbos_app_tools}/tomcat-connectors-1.2.32-src/native/configure': - cwd => "${rubbos_app_tools}/tomcat-connectors-1.2.32-src/native", - command => "${rubbos_app_tools}/tomcat-connectors-1.2.32-src/native/configure --with-apxs=${rubbos_app_tools}/apache2/bin/apxs --enable-jni --with-java-home=${rubbos_app_tools}/jdk1.6.0_27", - path => ["/bin","/sbin","/usr/bin","/usr/sbin","/usr/local/bin","/usr/local/sbin"], - subscribe => [ - Exec['tar xzvf ${rubbos_app_tools}/tomcat-connectors-1.2.32-src.tar.gz'], - Exec['make install httpd']], - refreshonly => true, - } - - exec {'make mod jk': - cwd => "${rubbos_app_tools}/tomcat-connectors-1.2.32-src/native", - command => "make", - path => ["/bin","/sbin","/usr/bin","/usr/sbin","/usr/local/bin","/usr/local/sbin"], - subscribe => Exec['${rubbos_app_tools}/tomcat-connectors-1.2.32-src/native/configure'], - refreshonly => true, - } - - exec {'make install mod jk': - cwd => "${rubbos_app_tools}/tomcat-connectors-1.2.32-src/native", - command => "make install", - path => ["/bin","/sbin","/usr/bin","/usr/sbin","/usr/local/bin","/usr/local/sbin"], - subscribe => Exec['make mod jk'], - refreshonly => true, - } - - # Config apache http server - file {'${rubbos_app_tools}/apache2/conf/httpd.conf': - ensure => present, - path => "${rubbos_app_tools}/apache2/conf/httpd.conf", - source => "puppet:///modules/rubbos_httpd/apache_conf/httpd.conf", - show_diff => false, - subscribe => [Exec['make install httpd'],Exec['make install mod jk']], - } - - file {'${rubbos_app_tools}/apache2/conf/workers.properties': - ensure => present, - path => "${rubbos_app_tools}/apache2/conf/workers.properties", - source => "puppet:///modules/rubbos_httpd/apache_conf/workers.properties", - show_diff => false, - subscribe => [Exec['make install httpd'],Exec['make install mod jk']], - } - - file {'${rubbos_app_tools}/apache2/htdocs/rubbos': - ensure => present, - path => "${rubbos_app_tools}/apache2/htdocs/rubbos", - recurse => true, - source => "puppet:///modules/rubbos_httpd/apache_files/rubbos_html", - show_diff => false, - subscribe => [Exec['make install httpd'],Exec['make install mod jk']], - } - - # Ensure apache2 service is running - service {'apache http server': - ensure => running, - hasstatus => false, - status => "ps aux | grep 'bin/httpd.*start$'", - start => "${rubbos_app_tools}/apache2/bin/apachectl -f ${rubbos_app_tools}/apache2/conf/httpd.conf -k start", - stop => "${rubbos_app_tools}/apache2/bin/apachectl -f ${rubbos_app_tools}/apache2/conf/httpd.conf -k stop", - subscribe => [ - File['${rubbos_app_tools}/apache2/conf/httpd.conf'], - File['${rubbos_app_tools}/apache2/conf/workers.properties']], - } - -} diff --git a/testsuites/rubbos/puppet_manifests/modules/rubbos_monitor/manifests/rubbos_monitor_off.pp b/testsuites/rubbos/puppet_manifests/modules/rubbos_monitor/manifests/rubbos_monitor_off.pp deleted file mode 100644 index b7072311..00000000 --- a/testsuites/rubbos/puppet_manifests/modules/rubbos_monitor/manifests/rubbos_monitor_off.pp +++ /dev/null @@ -1,53 +0,0 @@ -############################################################################# -# Copyright (c) 2016 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - - -class rubbos_monitor::rubbos_monitor_off { - - include params::rubbos_params - - # Declare some variables - $rubbos_app = $params::rubbos_params::rubbos_app - $rubbos_home = $params::rubbos_params::rubbos_home - - # Make uninstall sysstat - exec {'make uninstall sysstat': - cwd => "${rubbos_app}/sysstat-9.0.6", - command => "make uninstall", - path => ["/bin","/sbin","/usr/bin","/usr/sbin","/usr/local/bin","/usr/local/sbin"], - onlyif => "test -d ${rubbos_app}/sysstat-9.0.6", - } - - # Remove sysstat-9.0.6 folder - file {'${rubbos_app}/sysstat-9.0.6': - ensure => absent, - path => "${rubbos_app}/sysstat-9.0.6", - force => true, - recurse => true, - backup => false, - require => Exec['make uninstall sysstat'], - } - - # Remove bench folder - file {'${rubbos_home}/bench.tar.gz': - ensure => absent, - path => "${rubbos_home}/bench.tar.gz", - backup => false, - } - - file {'${rubbos_home}/bench': - ensure => absent, - path => "${rubbos_home}/bench", - force => true, - recurse => true, - backup => false, - show_diff => false, - } - -} diff --git a/testsuites/rubbos/puppet_manifests/modules/rubbos_monitor/manifests/rubbos_monitor_on.pp b/testsuites/rubbos/puppet_manifests/modules/rubbos_monitor/manifests/rubbos_monitor_on.pp deleted file mode 100644 index b9dad5e1..00000000 --- a/testsuites/rubbos/puppet_manifests/modules/rubbos_monitor/manifests/rubbos_monitor_on.pp +++ /dev/null @@ -1,110 +0,0 @@ -############################################################################# -# Copyright (c) 2016 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - - -class rubbos_monitor::rubbos_monitor_on { - - include params::rubbos_params - require rubbos_common::rubbos_common_on - - # Declare some variables - $rubbos_app = $params::rubbos_params::rubbos_app - $rubbos_home = $params::rubbos_params::rubbos_home - $rubbos_os_username = $params::rubbos_params::rubbos_os_username - $rubbos_os_usergroup = $params::rubbos_params::rubbos_os_usergroup - - # Prepare the bench folder and related files - file {'${rubbos_home}/bench.tar.gz': - ensure => file, - path => "${rubbos_home}/bench.tar.gz", - source => "puppet:///modules/rubbos_monitor/bench.tar.gz", - backup => false, - } - - exec {'tar zxvf ${rubbos_home}/bench.tar.gz': - cwd => "${rubbos_home}", - command => "tar zxvf ${rubbos_home}/bench.tar.gz", - path => ["/bin","/sbin","/usr/bin","/usr/sbin","/usr/local/bin","/usr/local/sbin"], - subscribe => File['${rubbos_home}/bench.tar.gz'], - } - - file {'flush_cache': - ensure => file, - path => "${rubbos_home}/bench/flush_cache", - source => "puppet:///modules/rubbos_monitor/flush_cache", - backup => false, - mode => 0755, - require => Exec['tar zxvf ${rubbos_home}/bench.tar.gz'], - } - - # Change owner and group for the bench folder - exec {'chown -R ${rubbos_os_username}:${rubbos_os_usergroup} ${rubbos_home}/bench': - cwd => "${rubbos_home}", - command => "chown -R ${rubbos_os_username}:${rubbos_os_usergroup} ${rubbos_home}/bench", - path => ["/bin","/sbin","/usr/bin","/usr/sbin","/usr/local/bin","/usr/local/sbin"], - require => File['flush_cache'], - } - - # Prepare cpu_mem.sh - file {'cpu_mem.sh': - ensure => file, - path => "${rubbos_app}/cpu_mem.sh", - source => "puppet:///modules/rubbos_monitor/cpu_mem.sh", - backup => false, - mode => 0755, - owner => "${rubbos_os_username}", - group => "${rubbos_os_usergroup}", - } - - # Prepare monitoring tool - file {'${rubbos_app}/sysstat-9.0.6.tar.gz': - ensure => file, - path => "${rubbos_app}/sysstat-9.0.6.tar.gz", - source => "puppet:///modules/rubbos_monitor/sysstat-9.0.6.tar.gz", - backup => false, - } - - exec {'tar xzvf ${rubbos_app}/sysstat-9.0.6.tar.gz': - cwd => "${rubbos_app}", - command => "tar xzvf ${rubbos_app}/sysstat-9.0.6.tar.gz", - path => ["/bin","/sbin","/usr/bin","/usr/sbin","/usr/local/bin","/usr/local/sbin"], - require => File['${rubbos_app}/sysstat-9.0.6.tar.gz'], - } - - # Build and install sysstat - exec {'configure sysstat': - cwd => "${rubbos_app}/sysstat-9.0.6", - command => "${rubbos_app}/sysstat-9.0.6/configure --prefix=${rubbos_app}/sysstat-9.0.6 --disable-nls", - path => ["/bin","/sbin","/usr/bin","/usr/sbin","/usr/local/bin","/usr/local/sbin"], - require => Exec['tar xzvf ${rubbos_app}/sysstat-9.0.6.tar.gz'], - } - - exec {'make sysstat': - cwd => "${rubbos_app}/sysstat-9.0.6", - command => "make", - path => ["/bin","/sbin","/usr/bin","/usr/sbin","/usr/local/bin","/usr/local/sbin"], - require => Exec['configure sysstat'], - } - - exec {'make install sysstat': - cwd => "${rubbos_app}/sysstat-9.0.6", - command => "make install", - path => ["/bin","/sbin","/usr/bin","/usr/sbin","/usr/local/bin","/usr/local/sbin"], - require => Exec['make sysstat'], - } - - # Change owner and group for the sysstat - exec {'chown -R ${rubbos_os_username}:${rubbos_os_usergroup} ${rubbos_app}/sysstat-9.0.6': - cwd => "${rubbos_app}", - command => "chown -R ${rubbos_os_username}:${rubbos_os_usergroup} ${rubbos_app}/sysstat-9.0.6", - path => ["/bin","/sbin","/usr/bin","/usr/sbin","/usr/local/bin","/usr/local/sbin"], - require => Exec['make install sysstat'], - } - -} diff --git a/testsuites/rubbos/puppet_manifests/modules/rubbos_mysql/files/prepare_rubbos_mysql_db.sh b/testsuites/rubbos/puppet_manifests/modules/rubbos_mysql/files/prepare_rubbos_mysql_db.sh deleted file mode 100755 index ee073684..00000000 --- a/testsuites/rubbos/puppet_manifests/modules/rubbos_mysql/files/prepare_rubbos_mysql_db.sh +++ /dev/null @@ -1,49 +0,0 @@ -#!/bin/bash -############################################################################# -# Copyright (c) 2016 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - - -## Usage: prepare_rubbos_mysql_db.sh rubbos_data_sql.tar.gz rubbos_data_sql_dir -## It is used for loading data into mysql database. -if [ ! -d '/usr/local/mysql' ] || [ $# -ne 2 ] || [ ! -f $1 ];then - echo "It requires: Mysql is installed, two arguments, and the second points to a data_sql file." - exit 1; -fi - -rubbos_mysql_db_compressed_file=$1 -rubbos_mysql_db_uncompressed_dir=$2 - -# clear database -echo "BEGIN RUBBOS DATABASE GIVE PRIVILEGES" -cat << EOF | /usr/local/mysql/bin/mysql -uroot - -DROP DATABASE IF EXISTS rubbos; - -CREATE DATABASE rubbos; - -GRANT ALL PRIVILEGES ON rubbos.* TO 'rubbos'@'%' \ - IDENTIFIED BY 'rubbos'; - flush privileges; -GRANT ALL PRIVILEGES ON rubbos.* TO 'rubbos'@'localhost' \ - IDENTIFIED BY 'rubbos'; - flush privileges; -EOF -echo "END RUBBOS DATABASE GIVE PRIVILEGES" - -# import sql data -echo "BEGIN IMPORT SQL DATA" -if [ -d '${rubbos_mysql_db_uncompressed_dir}' ]; then - rm -rf ${rubbos_mysql_db_uncompressed_dir} -fi -mkdir -p ${rubbos_mysql_db_uncompressed_dir} -tar zxvf ${rubbos_mysql_db_compressed_file} --directory ${rubbos_mysql_db_uncompressed_dir} -/usr/local/mysql/bin/mysql -uroot rubbos < ${rubbos_mysql_db_uncompressed_dir}/rubbos_data_sql -echo "END IMPORT SQL DATA" - -rm -rf ${rubbos_mysql_db_uncompressed_dir} diff --git a/testsuites/rubbos/puppet_manifests/modules/rubbos_mysql/manifests/rubbos_mysql_off.pp b/testsuites/rubbos/puppet_manifests/modules/rubbos_mysql/manifests/rubbos_mysql_off.pp deleted file mode 100644 index ec9a8717..00000000 --- a/testsuites/rubbos/puppet_manifests/modules/rubbos_mysql/manifests/rubbos_mysql_off.pp +++ /dev/null @@ -1,86 +0,0 @@ -############################################################################# -# Copyright (c) 2016 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - - -class rubbos_mysql::rubbos_mysql_off { - - include params::rubbos_params - - # Declare some variables - $rubbos_app_tools = $params::rubbos_params::rubbos_app_tools - $mysql_user_group = $params::rubbos_params::mysql_user_group - $mysql_user_name = $params::rubbos_params::mysql_user_name - $mysql_user_password = $params::rubbos_params::mysql_user_password - - file {'${rubbos_app_tools}/mysql-5.5.46-linux2.6-x86_64.tar.gz': - path => "${rubbos_app_tools}/mysql-5.5.46-linux2.6-x86_64.tar.gz", - ensure => absent, - backup => false, - } - - # Stop mysql - service {'stop mysql': - ensure => stopped, - hasstatus => false, - provider => "upstart", - status => "${rubbos_app_tools}/mysql-5.5.46-linux2.6-x86_64/support-files/mysql.server status | grep 'MySQL running'", - start => "${rubbos_app_tools}/mysql-5.5.46-linux2.6-x86_64/bin/mysqld_safe &", - stop => "${rubbos_app_tools}/mysql-5.5.46-linux2.6-x86_64/bin/mysqladmin shutdown", - } - - file {'${rubbos_app_tools}/mysql-5.5.46-linux2.6-x86_64': - ensure => absent, - path => "${rubbos_app_tools}/mysql-5.5.46-linux2.6-x86_64", - force => true, - recurse => true, - backup => false, - require => Service['stop mysql'], - } - - file {'${rubbos_home}/prepare_rubbos_mysql_db.sh': - ensure => absent, - path => "${rubbos_home}/prepare_rubbos_mysql_db.sh", - backup => false, - show_diff => false, - require => Service['stop mysql'], - } - - # Remove user and group - user {'${mysql_user_name}': - name => "${mysql_user_name}", - ensure => absent, - groups => "${mysql_user_group}", - password => "${mysql_user_password}", - require => File['${rubbos_app_tools}/mysql-5.5.46-linux2.6-x86_64'], - } - - group {'${mysql_user_group}': - name => "${mysql_user_group}", - ensure => absent, - require => User['${mysql_user_name}'], - } - - # Remove softlink - exec {'rm -rf /usr/local/mysql': - cwd => "/usr/local", - command => "rm -rf /usr/local/mysql", - onlyif => "test -h /usr/local/mysql", - path => ["/bin","/sbin","/usr/bin","/usr/sbin","/usr/local/bin","/usr/local/sbin"], - require => Group['mysql'], - } - - # Remove packages - package {'libaio-dev': - ensure => absent, - } - package {'libaio1': - ensure => absent, - } - -} diff --git a/testsuites/rubbos/puppet_manifests/modules/rubbos_mysql/manifests/rubbos_mysql_on.pp b/testsuites/rubbos/puppet_manifests/modules/rubbos_mysql/manifests/rubbos_mysql_on.pp deleted file mode 100644 index 81d45427..00000000 --- a/testsuites/rubbos/puppet_manifests/modules/rubbos_mysql/manifests/rubbos_mysql_on.pp +++ /dev/null @@ -1,98 +0,0 @@ -############################################################################# -# Copyright (c) 2016 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - - -class rubbos_mysql::rubbos_mysql_on { - - include params::rubbos_params - require rubbos_common::rubbos_common_on - - # Declare some variables - $rubbos_app = $params::rubbos_params::rubbos_app - $rubbos_app_tools = $params::rubbos_params::rubbos_app_tools - $rubbos_home = $params::rubbos_params::rubbos_home - $mysql_user_group = $params::rubbos_params::mysql_user_group - $mysql_user_name = $params::rubbos_params::mysql_user_name - $mysql_user_password = $params::rubbos_params::mysql_user_password - - # Add group and user - group {'${mysql_user_group}': - name => "${mysql_user_group}", - ensure => present, - before => User['${mysql_user_name}'], - } - user {'${mysql_user_name}': - name => "${mysql_user_name}", - ensure => present, - groups => "${mysql_user_group}", - password => "${mysql_user_password}", - before => File['${rubbos_app_tools}/mysql-5.5.46-linux2.6-x86_64.tar.gz'], - } - - # Prepare needed packages for mysql installation - package {'libaio-dev': - ensure => installed, - before => Exec['scripts/mysql_install_db --user=${mysql_user_name}'], - } - package {'libaio1': - ensure => installed, - before => Exec['scripts/mysql_install_db --user=${mysql_user_name}'], - } - - # Prepare and install mysql - file {'${rubbos_app_tools}/mysql-5.5.46-linux2.6-x86_64.tar.gz': - path => "${rubbos_app_tools}/mysql-5.5.46-linux2.6-x86_64.tar.gz", - ensure => present, - source => "puppet:///modules/rubbos_mysql/mysql-5.5.46-linux2.6-x86_64.tar.gz", - backup => false, - notify => Exec['tar -xf ${rubbos_app_tools}/mysql-5.5.46-linux2.6-x86_64.tar.gz'], - } - - exec {'tar -xf ${rubbos_app_tools}/mysql-5.5.46-linux2.6-x86_64.tar.gz': - cwd => "${rubbos_app_tools}", - command => "tar -xf ${rubbos_app_tools}/mysql-5.5.46-linux2.6-x86_64.tar.gz", - creates => "${rubbos_app_tools}/mysql-5.5.46-linux2.6-x86_64/scripts/mysql_install_db", - path => ["/bin","/sbin","/usr/bin","/usr/sbin","/usr/local/bin","/usr/local/sbin"], - } - - exec {'ln -s ${rubbos_app_tools}/mysql-5.5.46-linux2.6-x86_64 mysql': - cwd => "/usr/local", - command => "ln -s ${rubbos_app_tools}/mysql-5.5.46-linux2.6-x86_64 mysql", - path => ["/bin","/sbin","/usr/bin","/usr/sbin","/usr/local/bin","/usr/local/sbin"], - subscribe => Exec['tar -xf ${rubbos_app_tools}/mysql-5.5.46-linux2.6-x86_64.tar.gz'], - } - - exec {'scripts/mysql_install_db --user=${mysql_user_name}': - cwd => "${rubbos_app_tools}/mysql-5.5.46-linux2.6-x86_64", - command => "${rubbos_app_tools}/mysql-5.5.46-linux2.6-x86_64/scripts/mysql_install_db --user=${mysql_user_name}", - path => ["/bin","/sbin","/usr/bin","/usr/sbin","/usr/local/bin","/usr/local/sbin"], - require => Exec['ln -s ${rubbos_app_tools}/mysql-5.5.46-linux2.6-x86_64 mysql'], - } - - # Prepare a script - file {'${rubbos_home}/prepare_rubbos_mysql_db.sh': - path => "${rubbos_home}/prepare_rubbos_mysql_db.sh", - ensure => present, - source => "puppet:///modules/rubbos_mysql/prepare_rubbos_mysql_db.sh", - backup => false, - show_diff => false, - } - - # Start mysql service - service {'mysql': - ensure => running, - hasstatus => false, - provider => upstart, - status => "${rubbos_app_tools}/mysql-5.5.46-linux2.6-x86_64/support-files/mysql.server status | grep 'MySQL running'", - start => "${rubbos_app_tools}/mysql-5.5.46-linux2.6-x86_64/bin/mysqld_safe &", - stop => "${rubbos_app_tools}/mysql-5.5.46-linux2.6-x86_64/bin/mysqladmin shutdown", - require => Exec['scripts/mysql_install_db --user=${mysql_user_name}'], - } - -} diff --git a/testsuites/rubbos/puppet_manifests/modules/rubbos_tomcat/files/tomcat_sl/build.properties b/testsuites/rubbos/puppet_manifests/modules/rubbos_tomcat/files/tomcat_sl/build.properties deleted file mode 100644 index 5c108b45..00000000 --- a/testsuites/rubbos/puppet_manifests/modules/rubbos_tomcat/files/tomcat_sl/build.properties +++ /dev/null @@ -1,7 +0,0 @@ -src = . -dist =. -classes.dir = ./build -web.dir = ../Servlet_HTML - -j2ee = REPLACED_RUBBOS_APP_TOOLS/j2sdkee1.3.1 -mysql_connector = ./mysql-connector-java-5.1.7-bin.jar diff --git a/testsuites/rubbos/puppet_manifests/modules/rubbos_tomcat/files/tomcat_sl/mysql.properties b/testsuites/rubbos/puppet_manifests/modules/rubbos_tomcat/files/tomcat_sl/mysql.properties deleted file mode 100644 index 966cfa59..00000000 --- a/testsuites/rubbos/puppet_manifests/modules/rubbos_tomcat/files/tomcat_sl/mysql.properties +++ /dev/null @@ -1,17 +0,0 @@ -## DataSource configuration -datasource.name mysql - -#datasource.url jdbc:mysql://btnks-1:3313/rubbos -datasource.url REPLACED_MYSQL_JDBC_DB_URL -datasource.classname com.mysql.jdbc.Driver - -datasource.username REPLACED_MYSQL_USERNAME -datasource.password REPLACED_MYSQL_PASSWORD - - -## ConnectionManager configuration -jdbc.connchecklevel 1 -jdbc.connmaxage 30 -jdbc.connmaxthreads 4 -jdbc.connexcltimeout 30 -jdbc.connteststmt select 1 diff --git a/testsuites/rubbos/puppet_manifests/modules/rubbos_tomcat/files/tomcat_sl/rubbos_files/Makefile b/testsuites/rubbos/puppet_manifests/modules/rubbos_tomcat/files/tomcat_sl/rubbos_files/Makefile deleted file mode 100755 index e01d4e3e..00000000 --- a/testsuites/rubbos/puppet_manifests/modules/rubbos_tomcat/files/tomcat_sl/rubbos_files/Makefile +++ /dev/null @@ -1,79 +0,0 @@ - - -########################### -# RUBBoS Makefile # -########################### - -include config.mk - -############################## -# Environment variables # -############################## - -JAVA = $(JAVA_HOME)/bin/java -JAVAC = $(JAVA_HOME)/bin/javac -JAVACOPTS = -deprecation -JAVACC = $(JAVAC) $(JAVACOPTS) -RMIC = $(JAVA_HOME)/bin/rmic -RMIREGISTRY= $(JAVA_HOME)/bin/rmiregistry -CLASSPATH = .:$(J2EE_HOME)/lib/j2ee.jar:$(JAVA_HOME)/jre/lib/rt.jar -JAVADOC = $(JAVA_HOME)/javadoc - - -######################### -# Servlets version # -######################### -#ServletPrinter -Servlets = Config TimeManagement BrowseCategories Auth RegisterUser RubbosHttpServlet BrowseRegions SearchItemsByCategory SearchItemsByRegion ViewItem ViewBidHistory ViewUserInfo SellItemForm RegisterItem PutCommentAuth PutComment StoreComment BuyNowAuth BuyNow StoreBuyNow PutBidAuth PutBid StoreBid AboutMe - -all_servlets_sources = $(addprefix edu/rice/rubbos/servlets/, $(addsuffix .java, $(Servlets))) -all_servlets_obj = $(addprefix edu/rice/rubbos/servlets/, $(addsuffix .class, $(Servlets))) - -servlets: $(all_servlets_obj) - -clean_servlets: - rm -f edu/rice/rubbos/servlets/*.class - -#################### -# Client # -#################### - -ClientFiles = URLGenerator URLGeneratorPHP RUBBoSProperties Stats \ - TransitionTable ClientEmulator UserSession - -all_client_sources = $(addprefix edu/rice/rubbos/client/, $(addsuffix .java, $(ClientFiles))) -all_client_obj = $(addprefix edu/rice/rubbos/client/, $(addsuffix .class, $(ClientFiles))) edu/rice/rubbos/beans/TimeManagement.class - -client: $(all_client_obj) - -initDB: - ${JAVA} -classpath .:./database edu.rice.rubbos.client.InitDB ${PARAM} - -emulator: - ${JAVA} -classpath Client:Client/rubbos_client.jar:. -Xmx1300m -Dhttp.keepAlive=true -Dhttp.maxConnections=1000000 edu.rice.rubbos.client.ClientEmulator - -emulatorDebug: - ${JAVA} -classpath Client:Client/rubbos_client.jar:. -Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n -Xmx1300m -Dhttp.keepAlive=true -Dhttp.maxConnections=1000000 edu.rice.rubbos.client.ClientEmulator - - -############################ -# Global rules # -############################ - - -all: beans ejb_servlets client javadoc flush_cache - -world: all servlets - -javadoc : - ${JAVADOC} -d ./doc/api -bootclasspath ${CLASSPATH} -version -author -windowtitle "RUBBoS API" -header "RUBBoS (C)2001 Rice University/INRIA
" edu.rice.rubbos.beans edu.rice.rubbos.beans.servlets edu.rice.rubbos.client - -clean: - rm -f core edu/rice/rubbos/beans/*.class edu/rice/rubbos/beans/JOnAS* edu/rice/rubbos/beans/servlets/*.class edu/rice/rubbos/client/*.class edu/rice/rubbos/servlets/*.class - -%.class: %.java - ${JAVACC} -classpath ${CLASSPATH} $< - -flush_cache: bench/flush_cache.c - gcc bench/flush_cache.c -o bench/flush_cache - diff --git a/testsuites/rubbos/puppet_manifests/modules/rubbos_tomcat/files/tomcat_sl/rubbos_files/config.mk b/testsuites/rubbos/puppet_manifests/modules/rubbos_tomcat/files/tomcat_sl/rubbos_files/config.mk deleted file mode 100644 index 9182da4d..00000000 --- a/testsuites/rubbos/puppet_manifests/modules/rubbos_tomcat/files/tomcat_sl/rubbos_files/config.mk +++ /dev/null @@ -1,32 +0,0 @@ - -############################## -# Environment variables # -############################## - -JAVA = $(JAVA_HOME)/bin/java -JAVAC = $(JAVA_HOME)/bin/javac -JAVACOPTS = -deprecation -JAVACC = $(JAVAC) $(JAVACOPTS) -RMIC = $(JAVA_HOME)/bin/rmic -RMIREGISTRY= $(JAVA_HOME)/bin/rmiregistry -CLASSPATH = .:$(J2EE_HOME)/lib/j2ee.jar:$(JAVA_HOME)/jre/lib/rt.jar:$(SERVLET_API_PATH) -JAVADOC = $(JAVA_HOME)/bin/javadoc -JAR = $(JAVA_HOME)/bin/jar - -GENIC = ${JONAS_ROOT}/bin/unix/GenIC - -MAKE = gmake -CP = /bin/cp -RM = /bin/rm -MKDIR = /bin/mkdir - - -# EJB server: supported values are jonas or jboss -EJB_SERVER = jonas - -# DB server: supported values are MySQL or PostgreSQL -DB_SERVER = MySQL - -%.class: %.java - ${JAVACC} -classpath ${CLASSPATH} $< - diff --git a/testsuites/rubbos/puppet_manifests/modules/rubbos_tomcat/manifests/rubbos_tomcat_off.pp b/testsuites/rubbos/puppet_manifests/modules/rubbos_tomcat/manifests/rubbos_tomcat_off.pp deleted file mode 100644 index 30673b67..00000000 --- a/testsuites/rubbos/puppet_manifests/modules/rubbos_tomcat/manifests/rubbos_tomcat_off.pp +++ /dev/null @@ -1,80 +0,0 @@ -############################################################################# -# Copyright (c) 2016 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - - -class rubbos_tomcat::rubbos_tomcat_off { - - include params::rubbos_params - - # Declare some variables - $rubbos_app_tools = $params::rubbos_params::rubbos_app_tools - $rubbos_home = $params::rubbos_params::rubbos_home - - # stop tomcat server - exec {'${rubbos_app_tools}/apache-tomcat-5.5.17/bin/shutdown.sh': - cwd => "${rubbos_app_tools}/apache-tomcat-5.5.17", - command => "${rubbos_app_tools}/apache-tomcat-5.5.17/bin/shutdown.sh", - path => "/usr/bin:/usr/sbin:/bin:/sbin", - environment => "JAVA_HOME=${rubbos_app_tools}/jdk1.6.0_27", - onlyif => "test -f ${rubbos_app_tools}/apache-tomcat-5.5.17/bin/shutdown.sh", - notify => [ - File['${rubbos_app_tools}/apache-tomcat-5.5.17'], - File['${rubbos_app_tools}/j2sdkee1.3.1'], - File['${rubbos_app_tools}/apache-ant-1.6.5'], - ], - } - - file {'${rubbos_app_tools}/apache-tomcat-5.5.17.tar.gz': - ensure => absent, - path => "${rubbos_app_tools}/apache-tomcat-5.5.17.tar.gz", - backup => false, - } - - file {'${rubbos_app_tools}/apache-tomcat-5.5.17': - ensure => absent, - path => "${rubbos_app_tools}/apache-tomcat-5.5.17", - force => true, - backup => false, - } - - file {'${rubbos_app_tools}/j2sdkee1.3.1.tar.gz': - ensure => absent, - path => "${rubbos_app_tools}/j2sdkee1.3.1.tar.gz", - backup => false, - } - - file {'${rubbos_app_tools}/j2sdkee1.3.1': - ensure => absent, - path => "${rubbos_app_tools}/j2sdkee1.3.1", - force => true, - backup => false, - } - - file {'${rubbos_app_tools}/apache-ant-1.6.5.tar.gz': - ensure => absent, - path => "${rubbos_app_tools}/apache-ant-1.6.5.tar.gz", - backup => false, - } - - file {'${rubbos_app_tools}/apache-ant-1.6.5': - ensure => absent, - path => "${rubbos_app_tools}/apache-ant-1.6.5", - force => true, - backup => false, - } - - file {'${rubbos_home}/Servlets': - ensure => absent, - path => "${rubbos_home}/Servlets", - force => true, - recurse => true, - backup => false, - } - -} diff --git a/testsuites/rubbos/puppet_manifests/modules/rubbos_tomcat/manifests/rubbos_tomcat_on.pp b/testsuites/rubbos/puppet_manifests/modules/rubbos_tomcat/manifests/rubbos_tomcat_on.pp deleted file mode 100644 index 154b5fcb..00000000 --- a/testsuites/rubbos/puppet_manifests/modules/rubbos_tomcat/manifests/rubbos_tomcat_on.pp +++ /dev/null @@ -1,201 +0,0 @@ -############################################################################# -# Copyright (c) 2016 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - - -class rubbos_tomcat::rubbos_tomcat_on { - - include params::rubbos_params - require rubbos_common::rubbos_common_on - - # Declare some variables - $rubbos_app_tools = $params::rubbos_params::rubbos_app_tools - $rubbos_home = $params::rubbos_params::rubbos_home - - # Prepare packages - file {'${rubbos_app_tools}/apache-tomcat-5.5.17.tar.gz': - ensure => file, - path => "${rubbos_app_tools}/apache-tomcat-5.5.17.tar.gz", - source => "puppet:///modules/rubbos_tomcat/apache-tomcat-5.5.17.tar.gz", - backup => false, - } - - exec {'tar xzvf ${rubbos_app_tools}/apache-tomcat-5.5.17.tar.gz': - cwd => "${rubbos_app_tools}", - command => "tar xzvf ${rubbos_app_tools}/apache-tomcat-5.5.17.tar.gz", - path => ["/bin","/sbin","/usr/bin","/usr/sbin","/usr/local/bin","/usr/local/sbin"], - require => File['${rubbos_app_tools}/apache-tomcat-5.5.17.tar.gz'], - } - - file {'${rubbos_app_tools}/j2sdkee1.3.1.jar.gz': - ensure => file, - path => "${rubbos_app_tools}/j2sdkee1.3.1.jar.gz", - source => "puppet:///modules/rubbos_common/j2sdkee1.3.1.jar.gz", - backup => false, - } - - exec {'tar xzvf ${rubbos_app_tools}/j2sdkee1.3.1.jar.gz': - cwd => "${rubbos_app_tools}", - command => "tar xzvf ${rubbos_app_tools}/j2sdkee1.3.1.jar.gz", - path => ["/bin","/sbin","/usr/bin","/usr/sbin","/usr/local/bin","/usr/local/sbin"], - require => File['${rubbos_app_tools}/j2sdkee1.3.1.jar.gz'], - } - - file {'${rubbos_app_tools}/apache-ant-1.6.5.tar.gz': - ensure => file, - path => "${rubbos_app_tools}/apache-ant-1.6.5.tar.gz", - source => "puppet:///modules/rubbos_common/apache-ant-1.6.5.tar.gz", - backup => false, - } - - exec {'tar xzvf ${rubbos_app_tools}/apache-ant-1.6.5.tar.gz': - cwd => "${rubbos_app_tools}", - command => "tar xzvf ${rubbos_app_tools}/apache-ant-1.6.5.tar.gz", - path => ["/bin","/sbin","/usr/bin","/usr/sbin","/usr/local/bin","/usr/local/sbin"], - require => File['${rubbos_app_tools}/apache-ant-1.6.5.tar.gz'], - } - - # Override a config file: servier.xml - file {'${rubbos_app_tools}/apache-tomcat-5.5.17/conf/server.xml': - ensure => file, - path => "${rubbos_app_tools}/apache-tomcat-5.5.17/conf/server.xml", - source => "puppet:///modules/rubbos_tomcat/server.xml", - show_diff => false, - backup => false, - require => Exec['tar xzvf ${rubbos_app_tools}/apache-tomcat-5.5.17.tar.gz'], - } - - # Config tomcal_sl - file {'${rubbos_home}/build.properties': - ensure => file, - path => "${rubbos_home}/build.properties", - source => "puppet:///modules/rubbos_tomcat/tomcat_sl/build.properties", - backup => false, - } - - # Makefile - file {'${rubbos_home}/Makefile': - ensure => file, - path => "${rubbos_home}/Makefile", - source => "puppet:///modules/rubbos_tomcat/tomcat_sl/rubbos_files/Makefile", - backup => false, - } - - # config.mk - file {'${rubbos_home}/config.mk': - ensure => file, - path => "${rubbos_home}/config.mk", - source => "puppet:///modules/rubbos_tomcat/tomcat_sl/rubbos_files/config.mk", - backup => false, - } - - # servlets codes - file {'${rubbos_home}/Servlets': - ensure => directory, - path => "${rubbos_home}/Servlets", - recurse => true, - source => "puppet:///modules/rubbos_tomcat/tomcat_sl/rubbos_files/Servlets", - show_diff => false, - backup => false, - } - - # mysql.properties etc. - file {'${rubbos_home}/Servlets/mysql.properties': - ensure => file, - path => "${rubbos_home}/Servlets/mysql.properties", - source => "puppet:///modules/rubbos_tomcat/tomcat_sl/mysql.properties", - backup => false, - } - - file {'${rubbos_home}/Servlets/build.xml': - ensure => file, - path => "${rubbos_home}/Servlets/build.xml", - source => "puppet:///modules/rubbos_tomcat/tomcat_sl/build.xml", - backup => false, - show_diff => false, - require => File['${rubbos_home}/Servlets'], - } - - file {'${rubbos_home}/Servlets/edu/rice/rubbos/servlets/Config.java': - ensure => file, - path => "${rubbos_home}/Servlets/edu/rice/rubbos/servlets/Config.java", - source => "puppet:///modules/rubbos_tomcat/tomcat_sl/Config.java", - backup => false, - require => File['${rubbos_home}/Servlets'], - } - - # mkdir for web.xml - exec {'mkdir -p ${rubbos_home}/Servlet_HTML/WEB-INF': - command => "mkdir -p ${rubbos_home}/Servlet_HTML/WEB-INF", - creates => "${rubbos_home}/Servlet_HTML/WEB-INF", - path => ["/bin","/sbin","/usr/bin","/usr/sbin","/usr/local/bin","/usr/local/sbin"], - } - file {'${rubbos_home}/Servlet_HTML/WEB-INF/web.xml': - ensure => file, - path => "${rubbos_home}/Servlet_HTML/WEB-INF/web.xml", - source => "puppet:///modules/rubbos_tomcat/tomcat_sl/web.xml", - backup => false, - require => Exec['mkdir -p ${rubbos_home}/Servlet_HTML/WEB-INF'], - } - - ## build rubbos.war - exec {'ant clean': - cwd => "${rubbos_home}/Servlets", - command => "${rubbos_app_tools}/apache-ant-1.6.5/bin/ant clean", - environment => ["JAVA_HOME=${rubbos_app_tools}/jdk1.6.0_27","ANT_HOME=${rubbos_app_tools}/apache-ant-1.6.5"], - path => [ - "/bin","/sbin","/usr/bin","/usr/sbin","/usr/local/bin","/usr/local/sbin", - "${rubbos_app_tools}/jdk1.6.0_27/bin", - "${rubbos_app_tools}/jdk1.6.0_27/jre/bin", - "${rubbos_app_tools}/apache-ant-1.6.5/bin"], - require => [ - Exec['tar xzvf ${rubbos_app_tools}/j2sdkee1.3.1.jar.gz'], - Exec['tar xzvf ${rubbos_app_tools}/apache-ant-1.6.5.tar.gz'], - File['${rubbos_home}/build.properties'], - File['${rubbos_home}/Makefile'], - File['${rubbos_home}/config.mk'], - File['${rubbos_home}/Servlets/mysql.properties'], - File['${rubbos_home}/Servlets/build.xml'], - File['${rubbos_home}/Servlets/edu/rice/rubbos/servlets/Config.java'], - File['${rubbos_home}/Servlet_HTML/WEB-INF/web.xml']], - } - - exec {'ant dist': - cwd => "${rubbos_home}/Servlets", - command => "${rubbos_app_tools}/apache-ant-1.6.5/bin/ant dist", - environment => ["JAVA_HOME=${rubbos_app_tools}/jdk1.6.0_27","ANT_HOME=${rubbos_app_tools}/apache-ant-1.6.5"], - path => [ - "/bin","/sbin","/usr/bin","/usr/sbin","/usr/local/bin","/usr/local/sbin", - "${rubbos_app_tools}/jdk1.6.0_27/bin", - "${rubbos_app_tools}/jdk1.6.0_27/jre/bin", - "${rubbos_app_tools}/apache-ant-1.6.5/bin"], - subscribe => Exec['ant clean'], - } ## ant dist will generate: servlets.jar and rubbos.war - - exec {'deploy rubbos.war': - cwd => "${rubbos_app_tools}/apache-tomcat-5.5.17", - command => "cp ${rubbos_home}/Servlets/rubbos.war ${rubbos_app_tools}/apache-tomcat-5.5.17/webapps/", - onlyif => "test -f ${rubbos_home}/Servlets/rubbos.war", - path => ["/bin","/sbin","/usr/bin","/usr/sbin","/usr/local/bin","/usr/local/sbin"], - require => [ - Exec['ant dist'], - Exec['tar xzvf ${rubbos_app_tools}/apache-tomcat-5.5.17.tar.gz']], - } - - # Finally, start tomcat server - exec {'${rubbos_app_tools}/apache-tomcat-5.5.17/bin/startup.sh': - cwd => "${rubbos_app_tools}/apache-tomcat-5.5.17", - command => "${rubbos_app_tools}/apache-tomcat-5.5.17/bin/startup.sh", - path => ["/bin","/sbin","/usr/bin","/usr/sbin","/usr/local/bin","/usr/local/sbin"], - environment => "JAVA_HOME=${rubbos_app_tools}/jdk1.6.0_27", - require => [ - File['${rubbos_app_tools}/apache-tomcat-5.5.17/conf/server.xml'], - Exec['deploy rubbos.war']], - } - -} diff --git a/testsuites/rubbos/puppet_manifests/site_off.pp b/testsuites/rubbos/puppet_manifests/site_off.pp deleted file mode 100644 index a0d0b5e1..00000000 --- a/testsuites/rubbos/puppet_manifests/site_off.pp +++ /dev/null @@ -1,35 +0,0 @@ -############################################################################## -# Copyright (c) 2016 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - - -node default { } - -# mysql node: -node /.*rubbos[-|_]mysql.*/ { - include rubbos_mysql::rubbos_mysql_off - include rubbos_monitor::rubbos_monitor_off -} - -# tomcat node: -node /.*rubbos[-|_]tomcat.*/ { - include rubbos_tomcat::rubbos_tomcat_off - include rubbos_monitor::rubbos_monitor_off -} - -# httpd node: -node /.*rubbos[-|_]httpd.*/ { - include rubbos_httpd::rubbos_httpd_off - include rubbos_monitor::rubbos_monitor_off -} - -# clients -node /.*rubbos[-|_]client.*/ { - include rubbos_monitor::rubbos_monitor_off - include rubbos_client::rubbos_client_off -} diff --git a/testsuites/rubbos/puppet_manifests/site_on.pp b/testsuites/rubbos/puppet_manifests/site_on.pp deleted file mode 100644 index a9164ea5..00000000 --- a/testsuites/rubbos/puppet_manifests/site_on.pp +++ /dev/null @@ -1,39 +0,0 @@ -############################################################################## -# Copyright (c) 2016 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - - -node default { } - -# mysql node: -node /.*rubbos[-|_]mysql.*/ { - include rubbos_common::rubbos_common_on - include rubbos_mysql::rubbos_mysql_on - include rubbos_monitor::rubbos_monitor_on -} - -# tomcat node: -node /.*rubbos[-|_]tomcat.*/ { - include rubbos_common::rubbos_common_on - include rubbos_tomcat::rubbos_tomcat_on - include rubbos_monitor::rubbos_monitor_on -} - -# httpd node: -node /.*rubbos[-|_]httpd.*/ { - include rubbos_common::rubbos_common_on - include rubbos_httpd::rubbos_httpd_on - include rubbos_monitor::rubbos_monitor_on -} - -# clients -node /.*rubbos[-|_]client.*/ { - include rubbos_common::rubbos_common_on - include rubbos_monitor::rubbos_monitor_on - include rubbos_client::rubbos_client_on -} diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/apache_conf/httpd.conf b/testsuites/rubbos/rubbos_scripts/1-1-1/apache_conf/httpd.conf deleted file mode 100644 index 819bfa63..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/apache_conf/httpd.conf +++ /dev/null @@ -1,1076 +0,0 @@ - -# -# Based upon the NCSA server configuration files originally by Rob McCool. -# -# This is the main Apache server configuration file. It contains the -# configuration directives that give the server its instructions. -# See for detailed information about -# the directives. -# -# Do NOT simply read the instructions in here without understanding -# what they do. They're here only as hints or reminders. If you are unsure -# consult the online docs. You have been warned. -# -# The configuration directives are grouped into three basic sections: -# 1. Directives that control the operation of the Apache server process as a -# whole (the 'global environment'). -# 2. Directives that define the parameters of the 'main' or 'default' server, -# which responds to requests that aren't handled by a virtual host. -# These directives also provide default values for the settings -# of all virtual hosts. -# 3. Settings for virtual hosts, which allow Web requests to be sent to -# different IP addresses or hostnames and have them handled by the -# same Apache server process. -# -# Configuration and logfile names: If the filenames you specify for many -# of the server's control files begin with "/" (or "drive:/" for Win32), the -# server will use that explicit path. If the filenames do *not* begin -# with "/", the value of ServerRoot is prepended -- so "logs/foo.log" -# with ServerRoot set to "/mnt/elba/rubbos/apache2" will be interpreted by the -# server as "/mnt/elba/rubbos/apache2/logs/foo.log". -# - -### Section 1: Global Environment -# -# The directives in this section affect the overall operation of Apache, -# such as the number of concurrent requests it can handle or where it -# can find its configuration files. -# - -# -# ServerRoot: The top of the directory tree under which the server's -# configuration, error, and log files are kept. -# -# NOTE! If you intend to place this on an NFS (or otherwise network) -# mounted filesystem then please read the LockFile documentation (available -# at ); -# you will save yourself a lot of trouble. -# -# Do NOT add a slash at the end of the directory path. -# -#ServerRoot "/mnt/elba/rubbos/apache2" -ServerRoot "/bottlenecks/rubbos/app/apache2" - -# -# The accept serialization lock file MUST BE STORED ON A LOCAL DISK. -# - - -#LockFile logs/accept.lock - - - -# -# ScoreBoardFile: File used to store internal server process information. -# If unspecified (the default), the scoreboard will be stored in an -# anonymous shared memory segment, and will be unavailable to third-party -# applications. -# If specified, ensure that no two invocations of Apache share the same -# scoreboard file. The scoreboard file MUST BE STORED ON A LOCAL DISK. -# - - -#ScoreBoardFile logs/apache_runtime_status - - - - -# -# PidFile: The file in which the server should record its process -# identification number when it starts. -# - -PidFile logs/httpd.pid - - -# -# Timeout: The number of seconds before receives and sends time out. -# -Timeout 5 - -# -# KeepAlive: Whether or not to allow persistent connections (more than -# one request per connection). Set to "Off" to deactivate. -# -#KeepAlive On -KeepAlive Off - -# -# MaxKeepAliveRequests: The maximum number of requests to allow -# during a persistent connection. Set to 0 to allow an unlimited amount. -# We recommend you leave this number high, for maximum performance. -# -MaxKeepAliveRequests 100 - -# -# KeepAliveTimeout: Number of seconds to wait for the next request from the -# same client on the same connection. -# -KeepAliveTimeout 15 - -## -## Server-Pool Size Regulation (MPM specific) -## - -# prefork MPM -# StartServers: number of server processes to start -# MinSpareServers: minimum number of server processes which are kept spare -# MaxSpareServers: maximum number of server processes which are kept spare -# MaxClients: maximum number of server processes allowed to start -# MaxRequestsPerChild: maximum number of requests a server process serves - -StartServers 5 -MinSpareServers 5 -MaxSpareServers 10 -ServerLimit 4000 -MaxClients 4000 -MaxRequestsPerChild 0 - - -# worker MPM -# StartServers: initial number of server processes to start -# MaxClients: maximum number of simultaneous client connections -# MinSpareThreads: minimum number of worker threads which are kept spare -# MaxSpareThreads: maximum number of worker threads which are kept spare -# ThreadsPerChild: constant number of worker threads in each server process -# MaxRequestsPerChild: maximum number of requests a server process serves - -ServerLimit 200 -ThreadLimit 300 -StartServers 1 -MaxClients 300 -MinSpareThreads 5 -MaxSpareThreads 50 -ThreadsPerChild 150 -MaxRequestsPerChild 0 - - -# perchild MPM -# NumServers: constant number of server processes -# StartThreads: initial number of worker threads in each server process -# MinSpareThreads: minimum number of worker threads which are kept spare -# MaxSpareThreads: maximum number of worker threads which are kept spare -# MaxThreadsPerChild: maximum number of worker threads in each server process -# MaxRequestsPerChild: maximum number of connections per server process - -NumServers 5 -StartThreads 5 -MinSpareThreads 5 -MaxSpareThreads 10 -MaxThreadsPerChild 20 -MaxRequestsPerChild 0 - - -# WinNT MPM -# ThreadsPerChild: constant number of worker threads in the server process -# MaxRequestsPerChild: maximum number of requests a server process serves - -ThreadsPerChild 250 -MaxRequestsPerChild 0 - - -# BeOS MPM -# StartThreads: how many threads do we initially spawn? -# MaxClients: max number of threads we can have (1 thread == 1 client) -# MaxRequestsPerThread: maximum number of requests each thread will process - -StartThreads 10 -MaxClients 50 -MaxRequestsPerThread 10000 - - -# NetWare MPM -# ThreadStackSize: Stack size allocated for each worker thread -# StartThreads: Number of worker threads launched at server startup -# MinSpareThreads: Minimum number of idle threads, to handle request spikes -# MaxSpareThreads: Maximum number of idle threads -# MaxThreads: Maximum number of worker threads alive at the same time -# MaxRequestsPerChild: Maximum number of requests a thread serves. It is -# recommended that the default value of 0 be set for this -# directive on NetWare. This will allow the thread to -# continue to service requests indefinitely. - -ThreadStackSize 65536 -StartThreads 250 -MinSpareThreads 25 -MaxSpareThreads 250 -MaxThreads 1000 -MaxRequestsPerChild 0 -MaxMemFree 100 - - -# OS/2 MPM -# StartServers: Number of server processes to maintain -# MinSpareThreads: Minimum number of idle threads per process, -# to handle request spikes -# MaxSpareThreads: Maximum number of idle threads per process -# MaxRequestsPerChild: Maximum number of connections per server process - -StartServers 2 -MinSpareThreads 5 -MaxSpareThreads 10 -MaxRequestsPerChild 0 - - -# -# Listen: Allows you to bind Apache to specific IP addresses and/or -# ports, instead of the default. See also the -# directive. -# -# Change this to Listen on specific IP addresses as shown below to -# prevent Apache from glomming onto all bound IP addresses (0.0.0.0) -# -#Listen 12.34.56.78:80 - -Listen 8000 - -# -# Dynamic Shared Object (DSO) Support -# -# To be able to use the functionality of a module which was built as a DSO you -# have to place corresponding `LoadModule' lines at this location so the -# directives contained in it are actually available _before_ they are used. -# Statically compiled modules (those listed by `httpd -l') do not need -# to be loaded here. -# -# Example: -# LoadModule foo_module modules/mod_foo.so -# - -# -# ExtendedStatus controls whether Apache will generate "full" status -# information (ExtendedStatus On) or just basic information (ExtendedStatus -# Off) when the "server-status" handler is called. The default is Off. -# -#ExtendedStatus On - -### Section 2: 'Main' server configuration -# -# The directives in this section set up the values used by the 'main' -# server, which responds to any requests that aren't handled by a -# definition. These values also provide defaults for -# any containers you may define later in the file. -# -# All of these directives may appear inside containers, -# in which case these default settings will be overridden for the -# virtual host being defined. -# - - - -# -# If you wish httpd to run as a different user or group, you must run -# httpd as root initially and it will switch. -# -# User/Group: The name (or #number) of the user/group to run httpd as. -# . On SCO (ODT 3) use "User nouser" and "Group nogroup". -# . On HPUX you may not be able to use shared memory as nobody, and the -# suggested workaround is to create a user www and use that user. -# NOTE that some kernels refuse to setgid(Group) or semctl(IPC_SET) -# when the value of (unsigned)Group is above 60000; -# don't use Group #-1 on these systems! -# -User apache -Group apache - - - -# -# ServerAdmin: Your address, where problems with the server should be -# e-mailed. This address appears on some server-generated pages, such -# as error documents. e.g. admin@your-domain.com -# -ServerAdmin you@example.com - -# -# ServerName gives the name and port that the server uses to identify itself. -# This can often be determined automatically, but we recommend you specify -# it explicitly to prevent problems during startup. -# -# If this is not set to valid DNS name for your host, server-generated -# redirections will not work. See also the UseCanonicalName directive. -# -# If your host doesn't have a registered DNS name, enter its IP address here. -# You will have to access it by its address anyway, and this will make -# redirections work in a sensible way. -# -#ServerName www.example.com:80 - -# -# UseCanonicalName: Determines how Apache constructs self-referencing -# URLs and the SERVER_NAME and SERVER_PORT variables. -# When set "Off", Apache will use the Hostname and Port supplied -# by the client. When set "On", Apache will use the value of the -# ServerName directive. -# -UseCanonicalName Off - -# -# DocumentRoot: The directory out of which you will serve your -# documents. By default, all requests are taken from this directory, but -# symbolic links and aliases may be used to point to other locations. -# -#DocumentRoot "/mnt/elba/rubbos/apache2/htdocs" -DocumentRoot "/bottlenecks/rubbos/app/apache2/htdocs" - -# -# Each directory to which Apache has access can be configured with respect -# to which services and features are allowed and/or disabled in that -# directory (and its subdirectories). -# -# First, we configure the "default" to be a very restrictive set of -# features. -# - - Options FollowSymLinks - AllowOverride None - - -# -# Note that from this point forward you must specifically allow -# particular features to be enabled - so if something's not working as -# you might expect, make sure that you have specifically enabled it -# below. -# - -# -# This should be changed to whatever you set DocumentRoot to. -# - - -# -# Possible values for the Options directive are "None", "All", -# or any combination of: -# Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews -# -# Note that "MultiViews" must be named *explicitly* --- "Options All" -# doesn't give it to you. -# -# The Options directive is both complicated and important. Please see -# http://httpd.apache.org/docs-2.0/mod/core.html#options -# for more information. -# - Options Indexes FollowSymLinks - -# -# AllowOverride controls what directives may be placed in .htaccess files. -# It can be "All", "None", or any combination of the keywords: -# Options FileInfo AuthConfig Limit -# - AllowOverride None - -# -# Controls who can get stuff from this server. -# - Order allow,deny - Allow from all - - - -# -# UserDir: The name of the directory that is appended onto a user's home -# directory if a ~user request is received. -# -UserDir public_html - -# -# Control access to UserDir directories. The following is an example -# for a site where these directories are restricted to read-only. -# -# -# AllowOverride FileInfo AuthConfig Limit Indexes -# Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec -# -# Order allow,deny -# Allow from all -# -# -# Order deny,allow -# Deny from all -# -# - -# -# DirectoryIndex: sets the file that Apache will serve if a directory -# is requested. -# -# The index.html.var file (a type-map) is used to deliver content- -# negotiated documents. The MultiViews Option can be used for the -# same purpose, but it is much slower. -# -DirectoryIndex index.html index.html.var - -# -# AccessFileName: The name of the file to look for in each directory -# for additional configuration directives. See also the AllowOverride -# directive. -# -AccessFileName .htaccess - -# -# The following lines prevent .htaccess and .htpasswd files from being -# viewed by Web clients. -# - - Order allow,deny - Deny from all - - -# -# TypesConfig describes where the mime.types file (or equivalent) is -# to be found. -# -TypesConfig conf/mime.types - -# -# DefaultType is the default MIME type the server will use for a document -# if it cannot otherwise determine one, such as from filename extensions. -# If your server contains mostly text or HTML documents, "text/plain" is -# a good value. If most of your content is binary, such as applications -# or images, you may want to use "application/octet-stream" instead to -# keep browsers from trying to display binary files as though they are -# text. -# -DefaultType text/plain - -# -# The mod_mime_magic module allows the server to use various hints from the -# contents of the file itself to determine its type. The MIMEMagicFile -# directive tells the module where the hint definitions are located. -# - - MIMEMagicFile conf/magic - - -# -# HostnameLookups: Log the names of clients or just their IP addresses -# e.g., www.apache.org (on) or 204.62.129.132 (off). -# The default is off because it'd be overall better for the net if people -# had to knowingly turn this feature on, since enabling it means that -# each client request will result in AT LEAST one lookup request to the -# nameserver. -# -HostnameLookups Off - -# -# EnableMMAP: Control whether memory-mapping is used to deliver -# files (assuming that the underlying OS supports it). -# The default is on; turn this off if you serve from NFS-mounted -# filesystems. On some systems, turning it off (regardless of -# filesystem) can improve performance; for details, please see -# http://httpd.apache.org/docs-2.0/mod/core.html#enablemmap -# -#EnableMMAP off - -# -# EnableSendfile: Control whether the sendfile kernel support is -# used to deliver files (assuming that the OS supports it). -# The default is on; turn this off if you serve from NFS-mounted -# filesystems. Please see -# http://httpd.apache.org/docs-2.0/mod/core.html#enablesendfile -# -#EnableSendfile off - -# -# ErrorLog: The location of the error log file. -# If you do not specify an ErrorLog directive within a -# container, error messages relating to that virtual host will be -# logged here. If you *do* define an error logfile for a -# container, that host's errors will be logged there and not here. -# -ErrorLog logs/error_log - -# -# LogLevel: Control the number of messages logged to the error_log. -# Possible values include: debug, info, notice, warn, error, crit, -# alert, emerg. -# -LogLevel warn - -# -# The following directives define some format nicknames for use with -# a CustomLog directive (see below). -# -LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined -LogFormat "%h %l %u %t \"%r\" %>s %b" common -LogFormat "%{Referer}i -> %U" referer -LogFormat "%{User-agent}i" agent - -# You need to enable mod_logio.c to use %I and %O -#LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio - -# -# The location and format of the access logfile (Common Logfile Format). -# If you do not define any access logfiles within a -# container, they will be logged here. Contrariwise, if you *do* -# define per- access logfiles, transactions will be -# logged therein and *not* in this file. -# -CustomLog logs/access_log common - -# -# If you would like to have agent and referer logfiles, uncomment the -# following directives. -# -#CustomLog logs/referer_log referer -#CustomLog logs/agent_log agent - -# -# If you prefer a single logfile with access, agent, and referer information -# (Combined Logfile Format) you can use the following directive. -# -#CustomLog logs/access_log combined - -# -# ServerTokens -# This directive configures what you return as the Server HTTP response -# Header. The default is 'Full' which sends information about the OS-Type -# and compiled in modules. -# Set to one of: Full | OS | Minor | Minimal | Major | Prod -# where Full conveys the most information, and Prod the least. -# -ServerTokens Full - -# -# Optionally add a line containing the server version and virtual host -# name to server-generated pages (internal error documents, FTP directory -# listings, mod_status and mod_info output etc., but not CGI generated -# documents or custom error documents). -# Set to "EMail" to also include a mailto: link to the ServerAdmin. -# Set to one of: On | Off | EMail -# -ServerSignature On - -# -# Aliases: Add here as many aliases as you need (with no limit). The format is -# Alias fakename realname -# -# Note that if you include a trailing / on fakename then the server will -# require it to be present in the URL. So "/icons" isn't aliased in this -# example, only "/icons/". If the fakename is slash-terminated, then the -# realname must also be slash terminated, and if the fakename omits the -# trailing slash, the realname must also omit it. -# -# We include the /icons/ alias for FancyIndexed directory listings. If you -# do not use FancyIndexing, you may comment this out. -# -Alias /icons/ "/bottlenecks/rubbos/app/apache2/icons/" - - - Options Indexes MultiViews - AllowOverride None - Order allow,deny - Allow from all - - -# -# This should be changed to the ServerRoot/manual/. The alias provides -# the manual, even if you choose to move your DocumentRoot. You may comment -# this out if you do not care for the documentation. -# -AliasMatch ^/manual(?:/(?:de|en|es|fr|ja|ko|ru))?(/.*)?$ "/bottlenecks/rubbos/app/apache2/manual$1" - - - Options Indexes - AllowOverride None - Order allow,deny - Allow from all - - - SetHandler type-map - - - SetEnvIf Request_URI ^/manual/(de|en|es|fr|ja|ko|ru)/ prefer-language=$1 - RedirectMatch 301 ^/manual(?:/(de|en|es|fr|ja|ko|ru)){2,}(/.*)?$ /manual/$1$2 - - -# -# ScriptAlias: This controls which directories contain server scripts. -# ScriptAliases are essentially the same as Aliases, except that -# documents in the realname directory are treated as applications and -# run by the server when requested rather than as documents sent to the client. -# The same rules about trailing "/" apply to ScriptAlias directives as to -# Alias. -# -ScriptAlias /cgi-bin/ "/bottlenecks/rubbos/app/apache2/cgi-bin/" - - -# -# Additional to mod_cgid.c settings, mod_cgid has Scriptsock -# for setting UNIX socket for communicating with cgid. -# -#Scriptsock logs/cgisock - - -# -# "/mnt/elba/rubbos/apache2/cgi-bin" should be changed to whatever your ScriptAliased -# CGI directory exists, if you have that configured. -# - - AllowOverride None - Options None - Order allow,deny - Allow from all - - -# -# Redirect allows you to tell clients about documents which used to exist in -# your server's namespace, but do not anymore. This allows you to tell the -# clients where to look for the relocated document. -# Example: -# Redirect permanent /foo http://www.example.com/bar - -# -# Directives controlling the display of server-generated directory listings. -# - -# -# IndexOptions: Controls the appearance of server-generated directory -# listings. -# -IndexOptions FancyIndexing VersionSort - -# -# AddIcon* directives tell the server which icon to show for different -# files or filename extensions. These are only displayed for -# FancyIndexed directories. -# -AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip - -AddIconByType (TXT,/icons/text.gif) text/* -AddIconByType (IMG,/icons/image2.gif) image/* -AddIconByType (SND,/icons/sound2.gif) audio/* -AddIconByType (VID,/icons/movie.gif) video/* - -AddIcon /icons/binary.gif .bin .exe -AddIcon /icons/binhex.gif .hqx -AddIcon /icons/tar.gif .tar -AddIcon /icons/world2.gif .wrl .wrl.gz .vrml .vrm .iv -AddIcon /icons/compressed.gif .Z .z .tgz .gz .zip -AddIcon /icons/a.gif .ps .ai .eps -AddIcon /icons/layout.gif .html .shtml .htm .pdf -AddIcon /icons/text.gif .txt -AddIcon /icons/c.gif .c -AddIcon /icons/p.gif .pl .py -AddIcon /icons/f.gif .for -AddIcon /icons/dvi.gif .dvi -AddIcon /icons/uuencoded.gif .uu -AddIcon /icons/script.gif .conf .sh .shar .csh .ksh .tcl -AddIcon /icons/tex.gif .tex -AddIcon /icons/bomb.gif core - -AddIcon /icons/back.gif .. -AddIcon /icons/hand.right.gif README -AddIcon /icons/folder.gif ^^DIRECTORY^^ -AddIcon /icons/blank.gif ^^BLANKICON^^ - -# -# DefaultIcon is which icon to show for files which do not have an icon -# explicitly set. -# -DefaultIcon /icons/unknown.gif - -# -# AddDescription allows you to place a short description after a file in -# server-generated indexes. These are only displayed for FancyIndexed -# directories. -# Format: AddDescription "description" filename -# -#AddDescription "GZIP compressed document" .gz -#AddDescription "tar archive" .tar -#AddDescription "GZIP compressed tar archive" .tgz - -# -# ReadmeName is the name of the README file the server will look for by -# default, and append to directory listings. -# -# HeaderName is the name of a file which should be prepended to -# directory indexes. -ReadmeName README.html -HeaderName HEADER.html - -# -# IndexIgnore is a set of filenames which directory indexing should ignore -# and not include in the listing. Shell-style wildcarding is permitted. -# -IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t - -# -# DefaultLanguage and AddLanguage allows you to specify the language of -# a document. You can then use content negotiation to give a browser a -# file in a language the user can understand. -# -# Specify a default language. This means that all data -# going out without a specific language tag (see below) will -# be marked with this one. You probably do NOT want to set -# this unless you are sure it is correct for all cases. -# -# * It is generally better to not mark a page as -# * being a certain language than marking it with the wrong -# * language! -# -# DefaultLanguage nl -# -# Note 1: The suffix does not have to be the same as the language -# keyword --- those with documents in Polish (whose net-standard -# language code is pl) may wish to use "AddLanguage pl .po" to -# avoid the ambiguity with the common suffix for perl scripts. -# -# Note 2: The example entries below illustrate that in some cases -# the two character 'Language' abbreviation is not identical to -# the two character 'Country' code for its country, -# E.g. 'Danmark/dk' versus 'Danish/da'. -# -# Note 3: In the case of 'ltz' we violate the RFC by using a three char -# specifier. There is 'work in progress' to fix this and get -# the reference data for rfc1766 cleaned up. -# -# Catalan (ca) - Croatian (hr) - Czech (cs) - Danish (da) - Dutch (nl) -# English (en) - Esperanto (eo) - Estonian (et) - French (fr) - German (de) -# Greek-Modern (el) - Hebrew (he) - Italian (it) - Japanese (ja) -# Korean (ko) - Luxembourgeois* (ltz) - Norwegian Nynorsk (nn) -# Norwegian (no) - Polish (pl) - Portugese (pt) -# Brazilian Portuguese (pt-BR) - Russian (ru) - Swedish (sv) -# Simplified Chinese (zh-CN) - Spanish (es) - Traditional Chinese (zh-TW) -# -AddLanguage ca .ca -AddLanguage cs .cz .cs -AddLanguage da .dk -AddLanguage de .de -AddLanguage el .el -AddLanguage en .en -AddLanguage eo .eo -AddLanguage es .es -AddLanguage et .et -AddLanguage fr .fr -AddLanguage he .he -AddLanguage hr .hr -AddLanguage it .it -AddLanguage ja .ja -AddLanguage ko .ko -AddLanguage ltz .ltz -AddLanguage nl .nl -AddLanguage nn .nn -AddLanguage no .no -AddLanguage pl .po -AddLanguage pt .pt -AddLanguage pt-BR .pt-br -AddLanguage ru .ru -AddLanguage sv .sv -AddLanguage zh-CN .zh-cn -AddLanguage zh-TW .zh-tw - -# -# LanguagePriority allows you to give precedence to some languages -# in case of a tie during content negotiation. -# -# Just list the languages in decreasing order of preference. We have -# more or less alphabetized them here. You probably want to change this. -# -LanguagePriority en ca cs da de el eo es et fr he hr it ja ko ltz nl nn no pl pt pt-BR ru sv zh-CN zh-TW - -# -# ForceLanguagePriority allows you to serve a result page rather than -# MULTIPLE CHOICES (Prefer) [in case of a tie] or NOT ACCEPTABLE (Fallback) -# [in case no accepted languages matched the available variants] -# -ForceLanguagePriority Prefer Fallback - -# -# Commonly used filename extensions to character sets. You probably -# want to avoid clashes with the language extensions, unless you -# are good at carefully testing your setup after each change. -# See http://www.iana.org/assignments/character-sets for the -# official list of charset names and their respective RFCs. -# -AddCharset ISO-8859-1 .iso8859-1 .latin1 -AddCharset ISO-8859-2 .iso8859-2 .latin2 .cen -AddCharset ISO-8859-3 .iso8859-3 .latin3 -AddCharset ISO-8859-4 .iso8859-4 .latin4 -AddCharset ISO-8859-5 .iso8859-5 .latin5 .cyr .iso-ru -AddCharset ISO-8859-6 .iso8859-6 .latin6 .arb -AddCharset ISO-8859-7 .iso8859-7 .latin7 .grk -AddCharset ISO-8859-8 .iso8859-8 .latin8 .heb -AddCharset ISO-8859-9 .iso8859-9 .latin9 .trk -AddCharset ISO-2022-JP .iso2022-jp .jis -AddCharset ISO-2022-KR .iso2022-kr .kis -AddCharset ISO-2022-CN .iso2022-cn .cis -AddCharset Big5 .Big5 .big5 -# For russian, more than one charset is used (depends on client, mostly): -AddCharset WINDOWS-1251 .cp-1251 .win-1251 -AddCharset CP866 .cp866 -AddCharset KOI8-r .koi8-r .koi8-ru -AddCharset KOI8-ru .koi8-uk .ua -AddCharset ISO-10646-UCS-2 .ucs2 -AddCharset ISO-10646-UCS-4 .ucs4 -AddCharset UTF-8 .utf8 - -# The set below does not map to a specific (iso) standard -# but works on a fairly wide range of browsers. Note that -# capitalization actually matters (it should not, but it -# does for some browsers). -# -# See http://www.iana.org/assignments/character-sets -# for a list of sorts. But browsers support few. -# -AddCharset GB2312 .gb2312 .gb -AddCharset utf-7 .utf7 -AddCharset utf-8 .utf8 -AddCharset big5 .big5 .b5 -AddCharset EUC-TW .euc-tw -AddCharset EUC-JP .euc-jp -AddCharset EUC-KR .euc-kr -AddCharset shift_jis .sjis - -# -# AddType allows you to add to or override the MIME configuration -# file mime.types for specific file types. -# -#AddType application/x-tar .tgz -# -# AddEncoding allows you to have certain browsers uncompress -# information on the fly. Note: Not all browsers support this. -# Despite the name similarity, the following Add* directives have nothing -# to do with the FancyIndexing customization directives above. -# -#AddEncoding x-compress .Z -#AddEncoding x-gzip .gz .tgz -# -# If the AddEncoding directives above are commented-out, then you -# probably should define those extensions to indicate media types: -# -AddType application/x-compress .Z -AddType application/x-gzip .gz .tgz - -# -# AddHandler allows you to map certain file extensions to "handlers": -# actions unrelated to filetype. These can be either built into the server -# or added with the Action directive (see below) -# -# To use CGI scripts outside of ScriptAliased directories: -# (You will also need to add "ExecCGI" to the "Options" directive.) -# -#AddHandler cgi-script .cgi - -# -# For files that include their own HTTP headers: -# -#AddHandler send-as-is asis - -# -# For server-parsed imagemap files: -# -#AddHandler imap-file map - -# -# For type maps (negotiated resources): -# (This is enabled by default to allow the Apache "It Worked" page -# to be distributed in multiple languages.) -# -AddHandler type-map var - -# -# Filters allow you to process content before it is sent to the client. -# -# To parse .shtml files for server-side includes (SSI): -# (You will also need to add "Includes" to the "Options" directive.) -# -#AddType text/html .shtml -#AddOutputFilter INCLUDES .shtml - -# -# Action lets you define media types that will execute a script whenever -# a matching file is called. This eliminates the need for repeated URL -# pathnames for oft-used CGI file processors. -# Format: Action media/type /cgi-script/location -# Format: Action handler-name /cgi-script/location -# - -# -# Customizable error responses come in three flavors: -# 1) plain text 2) local redirects 3) external redirects -# -# Some examples: -#ErrorDocument 500 "The server made a boo boo." -#ErrorDocument 404 /missing.html -#ErrorDocument 404 "/cgi-bin/missing_handler.pl" -#ErrorDocument 402 http://www.example.com/subscription_info.html -# - -# -# Putting this all together, we can internationalize error responses. -# -# We use Alias to redirect any /error/HTTP_.html.var response to -# our collection of by-error message multi-language collections. We use -# includes to substitute the appropriate text. -# -# You can modify the messages' appearance without changing any of the -# default HTTP_.html.var files by adding the line: -# -# Alias /error/include/ "/your/include/path/" -# -# which allows you to create your own set of files by starting with the -# /mnt/elba/rubbos/apache2/error/include/ files and copying them to /your/include/path/, -# even on a per-VirtualHost basis. The default include files will display -# your Apache version number and your ServerAdmin email address regardless -# of the setting of ServerSignature. -# -# The internationalized error documents require mod_alias, mod_include -# and mod_negotiation. To activate them, uncomment the following 30 lines. - -# Alias /error/ "/mnt/elba/rubbos/apache2/error/" -# -# -# AllowOverride None -# Options IncludesNoExec -# AddOutputFilter Includes html -# AddHandler type-map var -# Order allow,deny -# Allow from all -# LanguagePriority en cs de es fr it ja ko nl pl pt-br ro sv tr -# ForceLanguagePriority Prefer Fallback -# -# -# ErrorDocument 400 /error/HTTP_BAD_REQUEST.html.var -# ErrorDocument 401 /error/HTTP_UNAUTHORIZED.html.var -# ErrorDocument 403 /error/HTTP_FORBIDDEN.html.var -# ErrorDocument 404 /error/HTTP_NOT_FOUND.html.var -# ErrorDocument 405 /error/HTTP_METHOD_NOT_ALLOWED.html.var -# ErrorDocument 408 /error/HTTP_REQUEST_TIME_OUT.html.var -# ErrorDocument 410 /error/HTTP_GONE.html.var -# ErrorDocument 411 /error/HTTP_LENGTH_REQUIRED.html.var -# ErrorDocument 412 /error/HTTP_PRECONDITION_FAILED.html.var -# ErrorDocument 413 /error/HTTP_REQUEST_ENTITY_TOO_LARGE.html.var -# ErrorDocument 414 /error/HTTP_REQUEST_URI_TOO_LARGE.html.var -# ErrorDocument 415 /error/HTTP_UNSUPPORTED_MEDIA_TYPE.html.var -# ErrorDocument 500 /error/HTTP_INTERNAL_SERVER_ERROR.html.var -# ErrorDocument 501 /error/HTTP_NOT_IMPLEMENTED.html.var -# ErrorDocument 502 /error/HTTP_BAD_GATEWAY.html.var -# ErrorDocument 503 /error/HTTP_SERVICE_UNAVAILABLE.html.var -# ErrorDocument 506 /error/HTTP_VARIANT_ALSO_VARIES.html.var - - -# -# The following directives modify normal HTTP response behavior to -# handle known problems with browser implementations. -# -BrowserMatch "Mozilla/2" nokeepalive -BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0 -BrowserMatch "RealPlayer 4\.0" force-response-1.0 -BrowserMatch "Java/1\.0" force-response-1.0 -BrowserMatch "JDK/1\.0" force-response-1.0 - -# -# The following directive disables redirects on non-GET requests for -# a directory that does not include the trailing slash. This fixes a -# problem with Microsoft WebFolders which does not appropriately handle -# redirects for folders with DAV methods. -# Same deal with Apple's DAV filesystem and Gnome VFS support for DAV. -# -BrowserMatch "Microsoft Data Access Internet Publishing Provider" redirect-carefully -BrowserMatch "^WebDrive" redirect-carefully -BrowserMatch "^WebDAVFS/1.[012]" redirect-carefully -BrowserMatch "^gnome-vfs" redirect-carefully - -# -# Allow server status reports generated by mod_status, -# with the URL of http://servername/server-status -# Change the ".example.com" to match your domain to enable. -# -# -# SetHandler server-status -# Order deny,allow -# Deny from all -# Allow from .example.com -# - -# -# Allow remote server configuration reports, with the URL of -# http://servername/server-info (requires that mod_info.c be loaded). -# Change the ".example.com" to match your domain to enable. -# -# -# SetHandler server-info -# Order deny,allow -# Deny from all -# Allow from .example.com -# - - -# -# Bring in additional module-specific configurations -# - - Include conf/ssl.conf - - - -### Section 3: Virtual Hosts -# -# VirtualHost: If you want to maintain multiple domains/hostnames on your -# machine you can setup VirtualHost containers for them. Most configurations -# use only name-based virtual hosts so the server doesn't need to worry about -# IP addresses. This is indicated by the asterisks in the directives below. -# -# Please see the documentation at -# -# for further details before you try to setup virtual hosts. -# -# You may use the command line option '-S' to verify your virtual host -# configuration. - -# -# Use name-based virtual hosting. -# -#NameVirtualHost *:80 - -# -# VirtualHost example: -# Almost any Apache directive may go into a VirtualHost container. -# The first VirtualHost section is used for requests without a known -# server name. -# -# -# ServerAdmin webmaster@dummy-host.example.com -# DocumentRoot /www/docs/dummy-host.example.com -# ServerName dummy-host.example.com -# ErrorLog logs/dummy-host.example.com-error_log -# CustomLog logs/dummy-host.example.com-access_log common -# - - - -LoadModule jk_module "/bottlenecks/rubbos/app/apache2/modules/mod_jk.so" - -# Where to find workers.properties -JkWorkersFile /bottlenecks/rubbos/app/apache2/conf/workers.properties - -# Where to put jk logs -JkLogFile /bottlenecks/rubbos/app/apache2/logs/mod_jk.log - -# Set the jk log level [debug/error/info] -JkLogLevel info - -# Select the log format -JkLogStampFormat "[%a %b %d %H:%M:%S %Y] " - -# JkOptions indicate to send SSL KEY SIZE, -JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories - -# JkRequestLogFormat set the request format -JkRequestLogFormat "%w %V %T" - -# Globally deny access to the WEB-INF directory - - AllowOverride None - deny from all - - - -JkMount /*/servlet/* worker1 -JkMount /*.jsp worker1 -#JkMount /rubbos worker1 -#JkMount /rubbos/* worker1 - - -ServerName localhost diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/apache_conf/workers.properties_template b/testsuites/rubbos/rubbos_scripts/1-1-1/apache_conf/workers.properties_template deleted file mode 100644 index 313d4d64..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/apache_conf/workers.properties_template +++ /dev/null @@ -1,215 +0,0 @@ - -# workers.properties - -# -# This file provides jk derived plugins with the needed information to -# connect to the different tomcat workers. Note that the distributed -# version of this file requires modification before it is usable by a -# plugin. -# -# As a general note, the characters $( and ) are used internally to define -# macros. Do not use them in your own configuration!!! -# -# Whenever you see a set of lines such as: -# x=value -# y=$(x)\something -# -# the final value for y will be value\something -# -# Normaly all you will need to do is un-comment and modify the first three -# properties, i.e. workers.tomcat_home, workers.java_home and ps. -# Most of the configuration is derived from these. -# -# When you are done updating workers.tomcat_home, workers.java_home and ps -# you should have 3 workers configured: -# -# - An ajp12 worker that connects to localhost:8007 -# - An ajp13 worker that connects to localhost:8009 -# - A jni inprocess worker. -# - A load balancer worker -# -# However by default the plugins will only use the ajp12 worker. To have -# the plugins use other workers you should modify the worker.list property. -# -# - -# OPTIONS ( very important for jni mode ) - -# -# workers.tomcat_home should point to the location where you -# installed tomcat. This is where you have your conf, webapps and lib -# directories. -# -#workers.tomcat_home=/mnt/elba/rubbos/apache-tomcat-5.5.17 -workers.tomcat_home=/bottlenecks/rubbos/app/apache-tomcat-5.5.17 - -# -# workers.java_home should point to your Java installation. Normally -# you should have a bin and lib directories beneath it. -# -#workers.java_home=/mnt/elba/rubbos/jdk1.6.0_27 -workers.java_home=/bottlenecks/rubbos/app/jdk1.6.0_27 - -# -# You should configure your environment slash... ps=\ on NT and / on UNIX -# and maybe something different elsewhere. -# -ps=/ - -# -#------ ADVANCED MODE ------------------------------------------------ -#--------------------------------------------------------------------- -# - -# -#------ DEFAULT worket list ------------------------------------------ -#--------------------------------------------------------------------- -# -# -# The workers that your plugins should create and work with -# -# Add 'inprocess' if you want JNI connector -worker.list=worker1 -# , inprocess - - -worker.TOMCAT1.port=8009 -worker.TOMCAT1.host=REPLACE_TOMCAT1_HOST -worker.TOMCAT1.type=ajp13 -worker.TOMCAT1.lbfactor=1 - - -# -#------ DEFAULT ajp12 WORKER DEFINITION ------------------------------ -#--------------------------------------------------------------------- -# - -# -# Defining a worker named ajp12 and of type ajp12 -# Note that the name and the type do not have to match. -# -#worker.ajp12.port=8007 -#worker.ajp12.host=localhost -#worker.ajp12.type=ajp12 -# -# Specifies the load balance factor when used with -# a load balancing worker. -# Note: -# ----> lbfactor must be > 0 -# ----> Low lbfactor means less work done by the worker. -#worker.ajp12.lbfactor=1 - -# -#------ DEFAULT ajp13 WORKER DEFINITION ------------------------------ -#--------------------------------------------------------------------- -# - -# -# Defining a worker named ajp13 and of type ajp13 -# Note that the name and the type do not have to match. -# -#worker.ajp13.port=8009 -#worker.ajp13.host=node60.rubbostest.Infosphere.emulab.net -#worker.ajp13.type=ajp13 -# -# Specifies the load balance factor when used with -# a load balancing worker. -# Note: -# ----> lbfactor must be > 0 -# ----> Low lbfactor means less work done by the worker. -#worker.ajp13.lbfactor=1 - -# -# Specify the size of the open connection cache. -#worker.ajp13.cachesize - -# -#------ DEFAULT LOAD BALANCER WORKER DEFINITION ---------------------- -#--------------------------------------------------------------------- -# - -# -# The router (type lb) workers perform wighted round-robin -# load balancing with sticky sessions. -# Note: -# ----> If a worker dies, the load balancer will check its state -# once in a while. Until then all work is redirected to peer -# workers. -worker.worker1.type=lb -worker.worker1.balance_workers=TOMCAT1 -worker.worker1.sticky_session=True -worker.worker1.method=Session - -# -#------ DEFAULT JNI WORKER DEFINITION--------------------------------- -#--------------------------------------------------------------------- -# - -# -# Defining a worker named inprocess and of type jni -# Note that the name and the type do not have to match. -# -worker.inprocess.type=jni - -# -#------ CLASSPATH DEFINITION ----------------------------------------- -#--------------------------------------------------------------------- -# - -# -# Additional class path components. -# -worker.inprocess.class_path=$(workers.tomcat_home)$(ps)lib$(ps)tomcat.jar - -# -# Setting the command line for tomcat. -# Note: The cmd_line string may not contain spaces. -# -worker.inprocess.cmd_line=start - -# Not needed, but can be customized. -#worker.inprocess.cmd_line=-config -#worker.inprocess.cmd_line=$(workers.tomcat_home)$(ps)conf$(ps)server.xml -#worker.inprocess.cmd_line=-home -#worker.inprocess.cmd_line=$(workers.tomcat_home) - -# -# The JVM that we are about to use -# -# This is for Java2 -# -# Windows -#worker.inprocess.jvm_lib=$(workers.java_home)$(ps)jre$(ps)bin$(ps)classic$(ps)jvm.dll -# IBM JDK1.3 -#worker.inprocess.jvm_lib=$(workers.java_home)$(ps)jre$(ps)bin$(ps)classic$(ps)libjvm.so -# Unix - Sun VM or blackdown -#worker.inprocess.jvm_lib=$(workers.java_home)$(ps)jre$(ps)lib$(ps)i386$(ps)classic$(ps)libjvm.so -worker.inprocess.jvm_lib=$(workers.java_home)$(ps)jre$(ps)lib$(ps)i386$(ps)server$(ps)libjvm.so - -# -# And this is for jdk1.1.X -# -#worker.inprocess.jvm_lib=$(workers.java_home)$(ps)bin$(ps)javai.dll - - -# -# Setting the place for the stdout and stderr of tomcat -# -worker.inprocess.stdout=$(workers.tomcat_home)$(ps)logs$(ps)inprocess.stdout -worker.inprocess.stderr=$(workers.tomcat_home)$(ps)logs$(ps)inprocess.stderr - -# -# Setting the tomcat.home Java property -# -#worker.inprocess.sysprops=tomcat.home=$(workers.tomcat_home) - -# -# Java system properties -# -# worker.inprocess.sysprops=java.compiler=NONE -# worker.inprocess.sysprops=myprop=mypropvalue - -# -# Additional path components. -# -# worker.inprocess.ld_path=d:$(ps)SQLLIB$(ps)bin -# diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/mysql_conf/my.cnf b/testsuites/rubbos/rubbos_scripts/1-1-1/mysql_conf/my.cnf deleted file mode 100644 index af273226..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/mysql_conf/my.cnf +++ /dev/null @@ -1,6 +0,0 @@ - -[client] -port = 3306 - -[mysqld] -server-id=1 diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/nsFile.txt b/testsuites/rubbos/rubbos_scripts/1-1-1/nsFile.txt deleted file mode 100644 index 00c73f3d..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/nsFile.txt +++ /dev/null @@ -1,48 +0,0 @@ - -set ns [new Simulator] -source tb_compat.tcl - - -set node1 [$ns node] -tb-set-node-os $node1 FC4-RUBBoS -tb-set-hardware $node1 pc3000 - -set node2 [$ns node] -tb-set-node-os $node2 FC4-RUBBoS -tb-set-hardware $node2 pc3000 - -set node3 [$ns node] -tb-set-node-os $node3 FC4-RUBBoS -tb-set-hardware $node3 pc3000 - -set node4 [$ns node] -tb-set-node-os $node4 FC4-RUBBoS -tb-set-hardware $node4 pc3000 - -set node5 [$ns node] -tb-set-node-os $node5 FC4-RUBBoS -tb-set-hardware $node5 pc3000 - -set node6 [$ns node] -tb-set-node-os $node6 FC4-RUBBoS -tb-set-hardware $node6 pc3000 - -set node7 [$ns node] -tb-set-node-os $node7 FC4-RUBBoS -tb-set-hardware $node7 pc3000 - -set node8 [$ns node] -tb-set-node-os $node8 FC4-RUBBoS -tb-set-hardware $node8 pc3000 - -set node9 [$ns node] -tb-set-node-os $node9 FC4-RUBBoS -tb-set-hardware $node9 pc3000 - -set lan1 [$ns make-lan "$node1 $node2 $node3 $node4 $node5 $node6 $node7 " 1000Mb 0ms] -set lan2 [$ns make-lan "$node7 $node8 " 1000Mb 0ms] -set lan4 [$ns make-lan "$node8 $node9 " 1000Mb 0ms] - - -$ns rtproto Static -$ns run diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/rubbos_conf/Makefile b/testsuites/rubbos/rubbos_scripts/1-1-1/rubbos_conf/Makefile deleted file mode 100644 index 565b22be..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/rubbos_conf/Makefile +++ /dev/null @@ -1,80 +0,0 @@ - - -########################### -# RUBBoS Makefile # -########################### - -include config.mk - -############################## -# Environment variables # -############################## - -JAVA = $(JAVA_HOME)/bin/java -JAVAC = $(JAVA_HOME)/bin/javac -JAVACOPTS = -deprecation -JAVACC = $(JAVAC) $(JAVACOPTS) -RMIC = $(JAVA_HOME)/bin/rmic -RMIREGISTRY= $(JAVA_HOME)/bin/rmiregistry -#CLASSPATH = .:$(J2EE_HOME)/lib/j2ee.jar:$(JAVA_HOME)/jre/lib/rt.jar:$TOMCATservlet.jar -CLASSPATH = .:$(J2EE_HOME)/lib/j2ee.jar:$(JAVA_HOME)/jre/lib/rt.jar -JAVADOC = $(JAVA_HOME)/javadoc - - -######################### -# Servlets version # -######################### -#ServletPrinter -Servlets = Config TimeManagement BrowseCategories Auth RegisterUser RubbosHttpServlet BrowseRegions SearchItemsByCategory SearchItemsByRegion ViewItem ViewBidHistory ViewUserInfo SellItemForm RegisterItem PutCommentAuth PutComment StoreComment BuyNowAuth BuyNow StoreBuyNow PutBidAuth PutBid StoreBid AboutMe - -all_servlets_sources = $(addprefix edu/rice/rubbos/servlets/, $(addsuffix .java, $(Servlets))) -all_servlets_obj = $(addprefix edu/rice/rubbos/servlets/, $(addsuffix .class, $(Servlets))) - -servlets: $(all_servlets_obj) - -clean_servlets: - rm -f edu/rice/rubbos/servlets/*.class - -#################### -# Client # -#################### - -ClientFiles = URLGenerator URLGeneratorPHP RUBBoSProperties Stats \ - TransitionTable ClientEmulator UserSession - -all_client_sources = $(addprefix edu/rice/rubbos/client/, $(addsuffix .java, $(ClientFiles))) -all_client_obj = $(addprefix edu/rice/rubbos/client/, $(addsuffix .class, $(ClientFiles))) edu/rice/rubbos/beans/TimeManagement.class - -client: $(all_client_obj) - -initDB: - ${JAVA} -classpath .:./database edu.rice.rubbos.client.InitDB ${PARAM} - -emulator: - ${JAVA} -classpath Client:Client/rubbos_client.jar:. -Xmx1300m -Dhttp.keepAlive=true -Dhttp.maxConnections=1000000 edu.rice.rubbos.client.ClientEmulator - -emulatorDebug: - ${JAVA} -classpath Client:Client/rubbos_client.jar:. -Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n -Xmx1300m -Dhttp.keepAlive=true -Dhttp.maxConnections=1000000 edu.rice.rubbos.client.ClientEmulator - - -############################ -# Global rules # -############################ - - -all: beans ejb_servlets client javadoc flush_cache - -world: all servlets - -javadoc : - ${JAVADOC} -d ./doc/api -bootclasspath ${CLASSPATH} -version -author -windowtitle "RUBBoS API" -header "RUBBoS (C)2001 Rice University/INRIA
" edu.rice.rubbos.beans edu.rice.rubbos.beans.servlets edu.rice.rubbos.client - -clean: - rm -f core edu/rice/rubbos/beans/*.class edu/rice/rubbos/beans/JOnAS* edu/rice/rubbos/beans/servlets/*.class edu/rice/rubbos/client/*.class edu/rice/rubbos/servlets/*.class - -%.class: %.java - ${JAVACC} -classpath ${CLASSPATH} $< - -flush_cache: bench/flush_cache.c - gcc bench/flush_cache.c -o bench/flush_cache - diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/rubbos_conf/build.properties b/testsuites/rubbos/rubbos_scripts/1-1-1/rubbos_conf/build.properties deleted file mode 100644 index dc3fbaaa..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/rubbos_conf/build.properties +++ /dev/null @@ -1,8 +0,0 @@ - -src = . -dist =. -classes.dir = ./build -web.dir = ../Servlet_HTML - -j2ee = /bottlenecks/rubbos/app/j2sdkee1.3.1 -mysql_connector = ./mysql-connector-java-5.1.7-bin.jar diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/rubbos_conf/config.mk b/testsuites/rubbos/rubbos_scripts/1-1-1/rubbos_conf/config.mk deleted file mode 100644 index 9182da4d..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/rubbos_conf/config.mk +++ /dev/null @@ -1,32 +0,0 @@ - -############################## -# Environment variables # -############################## - -JAVA = $(JAVA_HOME)/bin/java -JAVAC = $(JAVA_HOME)/bin/javac -JAVACOPTS = -deprecation -JAVACC = $(JAVAC) $(JAVACOPTS) -RMIC = $(JAVA_HOME)/bin/rmic -RMIREGISTRY= $(JAVA_HOME)/bin/rmiregistry -CLASSPATH = .:$(J2EE_HOME)/lib/j2ee.jar:$(JAVA_HOME)/jre/lib/rt.jar:$(SERVLET_API_PATH) -JAVADOC = $(JAVA_HOME)/bin/javadoc -JAR = $(JAVA_HOME)/bin/jar - -GENIC = ${JONAS_ROOT}/bin/unix/GenIC - -MAKE = gmake -CP = /bin/cp -RM = /bin/rm -MKDIR = /bin/mkdir - - -# EJB server: supported values are jonas or jboss -EJB_SERVER = jonas - -# DB server: supported values are MySQL or PostgreSQL -DB_SERVER = MySQL - -%.class: %.java - ${JAVACC} -classpath ${CLASSPATH} $< - diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/rubbos_conf/cpu_mem.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/rubbos_conf/cpu_mem.sh deleted file mode 100644 index 069cf079..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/rubbos_conf/cpu_mem.sh +++ /dev/null @@ -1,100 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -cd /bottlenecks/rubbos/rubbos_scripts/1-1-1 -source set_bottlenecks_rubbos_env.sh -cd - - -# delay inbetween snapshots - -delay=1 - -# central host to send results to -analysis_host=$BENCHMARK_HOST - -# monitoring start/end time in format YYYYmmddHHMMSS (20050920152059) -start_time=$1 -end_time=$2 - -# data filename suffix -data_filename_suffix="`hostname`-${start_time}.data" - -# sar filename -sar_filename=$RUBBOS_APP/sar-${data_filename_suffix} - -# iostat filename -iostat_filename=$RUBBOS_APP/iostat-${data_filename_suffix} - -# ps filename -ps_filename=$RUBBOS_APP/ps-${data_filename_suffix} - -# date command in predefined format -date_cmd="date +%Y%m%d%H%M%S" -date=`$date_cmd` - -# TEST MODE: start_time will be 2 seconds from launch, end time 5 seconds -#start_time=`expr $date \+ 2` -#end_time=`expr $date \+ 5` - -#echo -#echo Current timestamp: $date -#echo Start timestamp: $start_time -#echo End timestamp: $end_time -#echo - -# make sure they have all arguments -if [ "$end_time" = "" ]; then - echo usage: $0 \ \ \ \ - echo start_time and end_time are in YYYYmmddHHMMSS format - echo ie: 9/30/2005, 2:31:54pm = 20050930143154 - echo - exit -fi - -# wait until start time -#echo -n Waiting until start time \(${start_time}\).. -date=`$date_cmd` -while [ $date -lt $start_time ]; do - sleep 1 - date=`$date_cmd` -done -#echo - - -# launch iostat -sudo nice -n -1 $SYSSTAT_HOME/bin/iostat -dxtk $delay > ${iostat_filename} & -iostat_pid=$! - - -# run test until end time -#echo -n Running test until end time \(${end_time}\).. -while [ $date -lt $end_time ]; do - - sleep $delay - date=`$date_cmd` -done -#echo - - -# kill iostat -sudo kill -9 $iostat_pid - - -# chmod - -sudo chmod g+w ${iostat_filename} -sudo chmod o+r ${iostat_filename} - - -# send data to analysis host -#echo Sending data to analysis host.. -#scp -o StrictHostKeyChecking=no -o BatchMode=yes ${sar_filename} ${analysis_host}:/tmp/elba/rubbos -#scp -o StrictHostKeyChecking=no -o BatchMode=yes ${ps_filename} ${analysis_host}:/tmp/elba/rubbos - diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/rubbos_conf/mysql.properties_template b/testsuites/rubbos/rubbos_scripts/1-1-1/rubbos_conf/mysql.properties_template deleted file mode 100644 index 87a5fd8b..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/rubbos_conf/mysql.properties_template +++ /dev/null @@ -1,83 +0,0 @@ - -###################### PostgreSQL DataSource configuration example -# - - -##### -# DataSource configuration -# -datasource.name mysql - -datasource.url jdbc:mysql://REPLACE_MYSQL1_HOST:3306/rubbos -datasource.classname com.mysql.jdbc.Driver - -datasource.username rubbos -datasource.password rubbos - - -##### -# ConnectionManager configuration -# - -# JDBC connection checking level. -# 0 = no special checking -# 1 = check physical connection is still open before reusing it -# 2 = try every connection before reusing it -jdbc.connchecklevel 1 - -# Max age for jdbc connections -# nb of minutes a connection can be kept in the pool -jdbc.connmaxage 30 - -# Max concurrent threads on same tx/connection -# (not used with a customized jdbc datasource) -jdbc.connmaxthreads 4 - -# Max wait time if more than connmaxthreads threads request conn -# value is in seconds -# (not used with a customized jdbc datasource) -jdbc.connexcltimeout 30 - -# Test statement -jdbc.connteststmt select 1 - - -###### -# Customizing JDBC DataSource configuration -# - -# Name of the class implementing the XADataSource -#datasource.factory org.objectweb.jonas.dbm.JonasStandardXADataSource - -# JNDI name use to bind the XADataSource -#datasource.xadataname postgre1_xa - -# Minimum number of physical connection used by the XADataSource -#datasource.mincon 5 - -# Maximum number of physical connection used by the XADataSource -#datasource.maxcon 10 - -# Minimum number of XAConnection used by the pool -#jdbc.minconpool 10 - -# Maximum number of XAConnection used by the pool -#jdbc.maxconpool 20 - -# Time between two clean-up of old unused connection -# (value is in millisecond) -#jdbc.sleeptimepool 300000 - -# Force the gc to be launched when cleaning up -#jdbc.gcpool false - -# In case of no connection in the pool, -# deadlockpool is the global time to re-try before throwing an exception -# (value is in millisecond) -#jdbc.deadlockpool 300000 - -# In case of no connection in the pool, -# loopwaitpool is the unit time to re-try -# (value is in millisecond) -#jdbc.loopwaitpool 10000 - diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/rubbos_conf/rubbos-servletsBO.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/rubbos_conf/rubbos-servletsBO.sh deleted file mode 100644 index 4e9258bc..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/rubbos_conf/rubbos-servletsBO.sh +++ /dev/null @@ -1,77 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -############################################################################### -# -# This script runs first the RUBBoS browsing mix, then the read/write mix -# for each rubbos.properties_XX specified where XX is the number of emulated -# clients. Note that the rubbos.properties_XX files must be configured -# with the corresponding number of clients. -# In particular set the following variables in rubis.properties_XX: -# httpd_use_version = Servlets -# workload_number_of_clients_per_node = XX/number of client machines -# workload_transition_table = yourPath/RUBBoS/workload/transitions.txt -# -# This script should be run from the RUBBoS/bench directory on the local -# client machine. -# Results will be generated in the RUBBoS/bench directory. -# -################################################################################ - -#setenv SERVLETDIR $RUBBOS_HOME/Servlets - -set -x - -# Go back to RUBBoS root directory -cd .. - -export scp_options='-o StrictHostKeyChecking=no -o BatchMode=yes' - -# Browse only - -cp -fin ./workload/browse_only_transitions.txt ./workload/user_transitions.txt -cp -fin ./workload/browse_only_transitions.txt ./workload/author_transitions.txt - -for host in ${CLIENT1_HOST} ${CLIENT2_HOST} ${CLIENT3_HOST} ${CLIENT4_HOST} -do - scp ${scp_options} ./workload/browse_only_transitions.txt ${host}:${RUBBOS_HOME}/workload/user_transitions.txt - scp ${scp_options} ./workload/browse_only_transitions.txt ${host}:${RUBBOS_HOME}/workload/author_transitions.txt - scp ${scp_options} Client/rubbos.properties ${host}:${RUBBOS_HOME}/Client/rubbos.properties -done - -#bench/flush_cache 490000 -#ssh $HTTPD_HOST "$RUBBOS_HOME/bench/flush_cache 880000" # web server -#ssh $MYSQL1_HOST "$RUBBOS_HOME/bench/flush_cache 880000" # database server -#ssh $TOMCAT1_HOST "$RUBBOS_HOME/bench/flush_cache 780000" # servlet server -#ssh $CLIENT1_HOST "$RUBBOS_HOME/bench/flush_cache 490000" # remote client -#ssh $CLIENT2_HOST "$RUBBOS_HOME/bench/flush_cache 490000" # remote client -#ssh $CLIENT3_HOST "$RUBBOS_HOME/bench/flush_cache 490000" # remote client -#ssh $CLIENT4_HOST "$RUBBOS_HOME/bench/flush_cache 490000" # remote client - -RAMPUP=48000 -MI=72000 -current_seconds=`date +%s` -start_seconds=`echo \( $RAMPUP / 1000 \) + $current_seconds - 60 | bc` -SMI=`date -d "1970-01-01 $start_seconds secs UTC" +%Y%m%d%H%M%S` -end_seconds=`echo \( $RAMPUP / 1000 + $MI / 1000 + 30 \) + $current_seconds | bc` -EMI=`date -d "1970-01-01 $end_seconds secs UTC" +%Y%m%d%H%M%S` - -for host in $BENCHMARK_HOST $CLIENT1_HOST $CLIENT2_HOST $CLIENT3_HOST \ - $CLIENT4_HOST $HTTPD_HOST $TOMCAT1_HOST $MYSQL1_HOST -do - ssh $scp_options $host "sudo nice -n -1 $RUBBOS_APP/cpu_mem.sh $SMI $EMI" & -done - -echo "Rubbos emulator start $(date)" -make emulator -echo "Rubbos emulator end $(date)" - -set -x - diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/rubbos_conf/rubbos-servletsRW.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/rubbos_conf/rubbos-servletsRW.sh deleted file mode 100644 index 2dbd9788..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/rubbos_conf/rubbos-servletsRW.sh +++ /dev/null @@ -1,83 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -############################################################################### -# -# This script runs first the RUBBoS browsing mix, then the read/write mix -# for each rubbos.properties_XX specified where XX is the number of emulated -# clients. Note that the rubbos.properties_XX files must be configured -# with the corresponding number of clients. -# In particular set the following variables in rubis.properties_XX: -# httpd_use_version = Servlets -# workload_number_of_clients_per_node = XX/number of client machines -# workload_transition_table = yourPath/RUBBoS/workload/transitions.txt -# -# This script should be run from the RUBBoS/bench directory on the local -# client machine. -# Results will be generated in the RUBBoS/bench directory. -# -################################################################################ - -#setenv SERVLETDIR $RUBBOS_HOME/Servlets - -# Go back to RUBBoS root directory -cd .. - -# Read/write mix - -cp --fi ./workload/user_default_transitions.txt ./workload/user_transitions.txt -cp --fi ./workload/author_default_transitions.txt ./workload/author_transitions.txt - -scp ./workload/user_default_transitions.txt ${CLIENT1_HOST}:${RUBBOS_HOME}/workload/user_transitions.txt -scp ./workload/author_default_transitions.txt ${CLIENT1_HOST}:${RUBBOS_HOME}/workload/author_transitions.txt - -scp ./workload/user_default_transitions.txt ${CLIENT2_HOST}:${RUBBOS_HOME}/workload/user_transitions.txt -scp ./workload/author_default_transitions.txt ${CLIENT2_HOST}:${RUBBOS_HOME}/workload/author_transitions.txt - -scp ./workload/user_default_transitions.txt ${CLIENT3_HOST}:${RUBBOS_HOME}/workload/user_transitions.txt -scp ./workload/author_default_transitions.txt ${CLIENT3_HOST}:${RUBBOS_HOME}/workload/author_transitions.txt - -scp ./workload/user_default_transitions.txt ${CLIENT4_HOST}:${RUBBOS_HOME}/workload/user_transitions.txt -scp ./workload/author_default_transitions.txt ${CLIENT4_HOST}:${RUBBOS_HOME}/workload/author_transitions.txt - -scp Client/rubbos.properties ${CLIENT1_HOST}:${RUBBOS_HOME}/Client/rubbos.properties -scp Client/rubbos.properties ${CLIENT2_HOST}:${RUBBOS_HOME}/Client/rubbos.properties -scp Client/rubbos.properties ${CLIENT3_HOST}:${RUBBOS_HOME}/Client/rubbos.properties -scp Client/rubbos.properties ${CLIENT4_HOST}:${RUBBOS_HOME}/Client/rubbos.properties - - -bench/flush_cache 490000 -ssh $HTTPD_HOST "$RUBBOS_HOME/bench/flush_cache 880000" # web server -ssh $MYSQL1_HOST "$RUBBOS_HOME/bench/flush_cache 880000" # database server -ssh $TOMCAT1_HOST "$RUBBOS_HOME/bench/flush_cache 780000" # servlet server -ssh $CLIENT1_HOST "$RUBBOS_HOME/bench/flush_cache 490000" # remote client -ssh $CLIENT2_HOST "$RUBBOS_HOME/bench/flush_cache 490000" # remote client -ssh $CLIENT3_HOST "$RUBBOS_HOME/bench/flush_cache 490000" # remote client -ssh $CLIENT4_HOST "$RUBBOS_HOME/bench/flush_cache 490000" # remote client - -RAMPUP=480000 -MI=720000 -current_seconds=`date +%s` -start_seconds=`echo \( $RAMPUP / 1000 \) + $current_seconds - 60 | bc` -SMI=`date -d "1970-01-01 $start_seconds secs UTC" +%Y%m%d%H%M%S` -end_seconds=`echo \( $RAMPUP / 1000 + $MI / 1000 + 30 \) + $current_seconds | bc` -EMI=`date -d "1970-01-01 $end_seconds secs UTC" +%Y%m%d%H%M%S` -ssh $BENCHMARK_HOST "sudo nice -n -1 $RUBBOS_APP/cpu_mem.sh $SMI $EMI" & -ssh $CLIENT1_HOST "sudo nice -n -1 $RUBBOS_APP/cpu_mem.sh $SMI $EMI" & -ssh $CLIENT2_HOST "sudo nice -n -1 $RUBBOS_APP/cpu_mem.sh $SMI $EMI" & -ssh $CLIENT3_HOST "sudo nice -n -1 $RUBBOS_APP/cpu_mem.sh $SMI $EMI" & -ssh $CLIENT4_HOST "sudo nice -n -1 $RUBBOS_APP/cpu_mem.sh $SMI $EMI" & -ssh $HTTPD_HOST "sudo nice -n -1 $RUBBOS_APP/cpu_mem.sh $SMI $EMI" & -ssh $TOMCAT1_HOST "sudo nice -n -1 $RUBBOS_APP/cpu_mem.sh $SMI $EMI" & -ssh $MYSQL1_HOST "sudo nice -n -1 $RUBBOS_APP/cpu_mem.sh $SMI $EMI" & - - -make emulator - diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/rubbos_conf/rubbos.properties_template b/testsuites/rubbos/rubbos_scripts/1-1-1/rubbos_conf/rubbos.properties_template deleted file mode 100644 index 0e8a4b43..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/rubbos_conf/rubbos.properties_template +++ /dev/null @@ -1,79 +0,0 @@ - -#n HTTP server information -httpd_hostname = REPLACE_HTTPD_HOST -httpd_port = 8000 - -# C/JDBC server to monitor (if any) -cjdbc_hostname = - -# Precise which version to use. Valid options are : PHP, Servlets, EJB -httpd_use_version = Servlets - -# EJB server information -ejb_server = -ejb_html_path = -ejb_script_path = - -# Servlets server information -servlets_server = REPLACE_TOMCAT1_HOST -servlets_html_path = /rubbos -servlets_script_path = /rubbos/servlet - -# PHP information -php_html_path = /PHP -php_script_path = /PHP - -#Database information -database_master_server = REPLACE_MYSQL1_HOST - -database_slave_servers = -workload_remote_client_nodes = REPLACE_CLIENT1_HOST,REPLACE_CLIENT2_HOST,REPLACE_CLIENT3_HOST,REPLACE_CLIENT4_HOST -workload_remote_client_command = /bottlenecks/rubbos/app/jdk1.6.0_27/bin/java -classpath .:/bottlenecks/rubbos/app/RUBBoS/Client/:/bottlenecks/rubbos/app/RUBBoS/Client/rubbos_client.jar -Xmx1300m -Dhttp.keepAlive=true -Dhttp.maxConnections=1000000 edu.rice.rubbos.client.ClientEmulator - - -workload_number_of_clients_per_node = REPLACE_NUMBER_OF_CLIENTS_PER_NODE - - -# Workload: precise which transition table to use -workload_user_transition_table = /bottlenecks/rubbos/app/RUBBoS/workload/user_transitions.txt -workload_author_transition_table = /bottlenecks/rubbos/app/RUBBoS/workload/author_transitions.txt -workload_number_of_columns = 24 -workload_number_of_rows = 26 -workload_maximum_number_of_transitions = 1000 -workload_use_tpcw_think_time = yes -workload_number_of_stories_per_page = 20 - -workload_up_ramp_time_in_ms = 48000 -workload_up_ramp_slowdown_factor = 2 - -workload_session_run_time_in_ms = 72000 -workload_down_ramp_time_in_ms = 3000 -workload_down_ramp_slowdown_factor = 3 -workload_percentage_of_author = 10 - -# Users policy -database_number_of_authors = 50 -database_number_of_users = 500000 - -# Stories policy -database_story_dictionnary = /bottlenecks/rubbos/app/RUBBoS/database/dictionary -database_story_maximum_length = 1024 -database_oldest_story_year = 1998 -database_oldest_story_month = 1 - -# Comments policy -database_comment_max_length = 1024 - -# Connection timedout settings -connection_time_out_interval = 300 - - -# Monitoring Information -monitoring_debug_level = 1 -monitoring_program = /bottlenecks/rubbos/app/sysstat-9.0.6/bin/sar -monitoring_options = -u ALL -I SUM -monitoring_sampling_in_seconds = 1 -monitoring_rsh = /usr/bin/ssh -monitoring_scp = /usr/bin/scp -monitoring_gnuplot_terminal = png - diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/BENCHMARK_configure.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/BENCHMARK_configure.sh deleted file mode 100755 index 4c8c416a..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/BENCHMARK_configure.sh +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -cd /bottlenecks/rubbos/rubbos_scripts/1-1-1 -source set_bottlenecks_rubbos_env.sh - -echo "CONFIGURING RUBBOS CLIENT on $HOSTNAME" - -cp -r $WORK_HOME/rubbos_files/Client $RUBBOS_HOME/ -cp -r $WORK_HOME/rubbos_files/bench $RUBBOS_HOME/ - -cp $OUTPUT_HOME/rubbos_conf/build.properties $RUBBOS_HOME/ -cp $OUTPUT_HOME/rubbos_conf/config.mk $RUBBOS_HOME/ -cp $OUTPUT_HOME/rubbos_conf/Makefile $RUBBOS_HOME/ - -cp $OUTPUT_HOME/rubbos_conf/rubbos-servletsBO.sh $RUBBOS_HOME/bench/ -cp $OUTPUT_HOME/rubbos_conf/rubbos-servletsRW.sh $RUBBOS_HOME/bench/ - -chmod ug+x $RUBBOS_HOME/bench/*.sh - -#build clients -echo "COMPILING RUBBOS CLIENT on $HOSTNAME" -cd $RUBBOS_HOME/Client -make clean >/dev/null -make >/dev/null 2>&1 - -echo "DONE CONFIGURING RUBBOS CLIENT on $HOSTNAME" diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/BENCHMARK_install.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/BENCHMARK_install.sh deleted file mode 100755 index f516b061..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/BENCHMARK_install.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -cd /bottlenecks/rubbos/rubbos_scripts/1-1-1 -source set_bottlenecks_rubbos_env.sh - -echo "INSTALLING RUBBOS CLIENT on $HOSTNAME" - -if [ ! -d "$RUBBOS_APP" ]; then -mkdir -p $RUBBOS_APP -chmod 755 $RUBBOS_APP -fi - -tar xzf $SOFTWARE_HOME/$JAVA_TARBALL --directory=$RUBBOS_APP - -echo "DONE INSTALLING RUBBOS CLIENT on $HOSTNAME" diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/BENCHMARK_pkg_prepare.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/BENCHMARK_pkg_prepare.sh deleted file mode 100755 index 7e96fe81..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/BENCHMARK_pkg_prepare.sh +++ /dev/null @@ -1,45 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -. ../set_bottlenecks_rubbos_env.sh - -scp_options="-o StrictHostKeyChecking=no -o BatchMode=yes" - -# Packages for BENCHMARK rubbos install -if true; then -ssh $BENCHMARK_HOST "mkdir -p /bottlenecks/rubbos/rubbos_scripts/1-1-1" -scp $scp_options ../set_bottlenecks_rubbos_env.sh $BENCHMARK_HOST:/bottlenecks/rubbos/rubbos_scripts/1-1-1 - -ssh $BENCHMARK_HOST "mkdir -p $SOFTWARE_HOME" -scp $scp_options $SOFTWARE_HOME/$RUBBOS_TARBALL $BENCHMARK_HOST:$SOFTWARE_HOME/$RUBBOS_TARBALL -scp $scp_options $SOFTWARE_HOME/flush_cache $BENCHMARK_HOST:$SOFTWARE_HOME/flush_cache -scp $scp_options $SOFTWARE_HOME/$SYSSTAT_TARBALL $BENCHMARK_HOST:$SOFTWARE_HOME/$SYSSTAT_TARBALL -ssh $BENCHMARK_HOST "mkdir -p $OUTPUT_HOME/rubbos_conf" -scp $scp_options $OUTPUT_HOME/rubbos_conf/cpu_mem.sh $BENCHMARK_HOST:$OUTPUT_HOME/rubbos_conf/cpu_mem.sh -fi - -# Packages for BENCHMARK install -if true; then -scp $scp_options $SOFTWARE_HOME/$JAVA_TARBALL $BENCHMARK_HOST:$SOFTWARE_HOME/$JAVA_TARBALL -fi - -# Packages for BENCHMARK configure -if true; then -ssh $BENCHMARK_HOST "mkdir -p $WORK_HOME/rubbos_files" -scp $scp_options -r $WORK_HOME/rubbos_files/Client $BENCHMARK_HOST:$WORK_HOME/rubbos_files -scp $scp_options -r $WORK_HOME/rubbos_files/bench $BENCHMARK_HOST:$WORK_HOME/rubbos_files -ssh $BENCHMARK_HOST "mkdir -p $OUTPUT_HOME/rubbos_conf" -for i in build.properties config.mk Makefile \ - rubbos-servletsBO.sh rubbos-servletsRW.sh -do - scp $scp_options -r $OUTPUT_HOME/rubbos_conf/$i $BENCHMARK_HOST:$OUTPUT_HOME/rubbos_conf/$i -done -fi - diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/BENCHMARK_rubbos_install.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/BENCHMARK_rubbos_install.sh deleted file mode 100755 index 6f2555aa..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/BENCHMARK_rubbos_install.sh +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -cd /bottlenecks/rubbos/rubbos_scripts/1-1-1 -source set_bottlenecks_rubbos_env.sh - -echo "INSTALLING RUBBOS/SYSSTAT on $HOSTNAME" - -if [ ! -d "$RUBBOS_APP" ]; then -mkdir -p $RUBBOS_APP -chmod 755 $RUBBOS_APP -fi - -# install RUBBoS -tar xzf $SOFTWARE_HOME/$RUBBOS_TARBALL --directory=$RUBBOS_APP -#tar xzf $SOFTWARE_HOME/rubbos_html.tar.gz --directory=$RUBBOS_HOME/Servlet_HTML/ -cp $SOFTWARE_HOME/flush_cache $RUBBOS_HOME/bench/. - -# install sysstat -tar xzf $SOFTWARE_HOME/$SYSSTAT_TARBALL --directory=$RUBBOS_APP - -cd $SYSSTAT_HOME -./configure --prefix=$SYSSTAT_HOME >/dev/null -make >/dev/null 2>&1 -sudo make install >/dev/null - -# install a script to collect statistics data -cp $OUTPUT_HOME/rubbos_conf/cpu_mem.sh $RUBBOS_APP/. -chmod 755 $RUBBOS_APP/cpu_mem.sh - -echo "DONE INSTALLING RUBBOS/SYSSTAT on $HOSTNAME" diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/BENCHMARK_rubbos_uninstall.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/BENCHMARK_rubbos_uninstall.sh deleted file mode 100755 index 413ee958..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/BENCHMARK_rubbos_uninstall.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -cd /bottlenecks/rubbos/rubbos_scripts/1-1-1 -source set_bottlenecks_rubbos_env.sh - -cd $SYSSTAT_HOME -sudo make uninstall -sudo rm -rf $SYSSTAT_HOME -rm -rf $RUBBOS_HOME -#rm -rf $ELBA_TOP diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/BENCHMARK_uninstall.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/BENCHMARK_uninstall.sh deleted file mode 100755 index 36ecde18..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/BENCHMARK_uninstall.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -cd /bottlenecks/rubbos/rubbos_scripts/1-1-1 -source set_bottlenecks_rubbos_env.sh - -rm -rf $JAVA_HOME -#rm -rf $ELBA_TOP diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT1_configure.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT1_configure.sh deleted file mode 100755 index 4c8c416a..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT1_configure.sh +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -cd /bottlenecks/rubbos/rubbos_scripts/1-1-1 -source set_bottlenecks_rubbos_env.sh - -echo "CONFIGURING RUBBOS CLIENT on $HOSTNAME" - -cp -r $WORK_HOME/rubbos_files/Client $RUBBOS_HOME/ -cp -r $WORK_HOME/rubbos_files/bench $RUBBOS_HOME/ - -cp $OUTPUT_HOME/rubbos_conf/build.properties $RUBBOS_HOME/ -cp $OUTPUT_HOME/rubbos_conf/config.mk $RUBBOS_HOME/ -cp $OUTPUT_HOME/rubbos_conf/Makefile $RUBBOS_HOME/ - -cp $OUTPUT_HOME/rubbos_conf/rubbos-servletsBO.sh $RUBBOS_HOME/bench/ -cp $OUTPUT_HOME/rubbos_conf/rubbos-servletsRW.sh $RUBBOS_HOME/bench/ - -chmod ug+x $RUBBOS_HOME/bench/*.sh - -#build clients -echo "COMPILING RUBBOS CLIENT on $HOSTNAME" -cd $RUBBOS_HOME/Client -make clean >/dev/null -make >/dev/null 2>&1 - -echo "DONE CONFIGURING RUBBOS CLIENT on $HOSTNAME" diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT1_install.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT1_install.sh deleted file mode 100755 index f516b061..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT1_install.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -cd /bottlenecks/rubbos/rubbos_scripts/1-1-1 -source set_bottlenecks_rubbos_env.sh - -echo "INSTALLING RUBBOS CLIENT on $HOSTNAME" - -if [ ! -d "$RUBBOS_APP" ]; then -mkdir -p $RUBBOS_APP -chmod 755 $RUBBOS_APP -fi - -tar xzf $SOFTWARE_HOME/$JAVA_TARBALL --directory=$RUBBOS_APP - -echo "DONE INSTALLING RUBBOS CLIENT on $HOSTNAME" diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT1_pkg_prepare.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT1_pkg_prepare.sh deleted file mode 100755 index f73ff9fd..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT1_pkg_prepare.sh +++ /dev/null @@ -1,45 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -. ../set_bottlenecks_rubbos_env.sh - -scp_options="-o StrictHostKeyChecking=no -o BatchMode=yes" - -# Packages for CLIENT1 rubbos install -if true; then -ssh $CLIENT1_HOST "mkdir -p /bottlenecks/rubbos/rubbos_scripts/1-1-1" -scp $scp_options ../set_bottlenecks_rubbos_env.sh $CLIENT1_HOST:/bottlenecks/rubbos/rubbos_scripts/1-1-1 - -ssh $CLIENT1_HOST "mkdir -p $SOFTWARE_HOME" -scp $scp_options $SOFTWARE_HOME/$RUBBOS_TARBALL $CLIENT1_HOST:$SOFTWARE_HOME/$RUBBOS_TARBALL -scp $scp_options $SOFTWARE_HOME/flush_cache $CLIENT1_HOST:$SOFTWARE_HOME/flush_cache -scp $scp_options $SOFTWARE_HOME/$SYSSTAT_TARBALL $CLIENT1_HOST:$SOFTWARE_HOME/$SYSSTAT_TARBALL -ssh $CLIENT1_HOST "mkdir -p $OUTPUT_HOME/rubbos_conf" -scp $scp_options $OUTPUT_HOME/rubbos_conf/cpu_mem.sh $CLIENT1_HOST:$OUTPUT_HOME/rubbos_conf/cpu_mem.sh -fi - -# Packages for CLIENT1 install -if true; then -scp $scp_options $SOFTWARE_HOME/$JAVA_TARBALL $CLIENT1_HOST:$SOFTWARE_HOME/$JAVA_TARBALL -fi - -# Packages for CLIENT1 configure -if true; then -ssh $CLIENT1_HOST "mkdir -p $WORK_HOME/rubbos_files" -scp $scp_options -r $WORK_HOME/rubbos_files/Client $CLIENT1_HOST:$WORK_HOME/rubbos_files -scp $scp_options -r $WORK_HOME/rubbos_files/bench $CLIENT1_HOST:$WORK_HOME/rubbos_files -ssh $CLIENT1_HOST "mkdir -p $OUTPUT_HOME/rubbos_conf" -for i in build.properties config.mk Makefile \ - rubbos-servletsBO.sh rubbos-servletsRW.sh -do - scp $scp_options -r $OUTPUT_HOME/rubbos_conf/$i $CLIENT1_HOST:$OUTPUT_HOME/rubbos_conf/$i -done -fi - diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT1_rubbos_install.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT1_rubbos_install.sh deleted file mode 100755 index 6f2555aa..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT1_rubbos_install.sh +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -cd /bottlenecks/rubbos/rubbos_scripts/1-1-1 -source set_bottlenecks_rubbos_env.sh - -echo "INSTALLING RUBBOS/SYSSTAT on $HOSTNAME" - -if [ ! -d "$RUBBOS_APP" ]; then -mkdir -p $RUBBOS_APP -chmod 755 $RUBBOS_APP -fi - -# install RUBBoS -tar xzf $SOFTWARE_HOME/$RUBBOS_TARBALL --directory=$RUBBOS_APP -#tar xzf $SOFTWARE_HOME/rubbos_html.tar.gz --directory=$RUBBOS_HOME/Servlet_HTML/ -cp $SOFTWARE_HOME/flush_cache $RUBBOS_HOME/bench/. - -# install sysstat -tar xzf $SOFTWARE_HOME/$SYSSTAT_TARBALL --directory=$RUBBOS_APP - -cd $SYSSTAT_HOME -./configure --prefix=$SYSSTAT_HOME >/dev/null -make >/dev/null 2>&1 -sudo make install >/dev/null - -# install a script to collect statistics data -cp $OUTPUT_HOME/rubbos_conf/cpu_mem.sh $RUBBOS_APP/. -chmod 755 $RUBBOS_APP/cpu_mem.sh - -echo "DONE INSTALLING RUBBOS/SYSSTAT on $HOSTNAME" diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT1_rubbos_uninstall.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT1_rubbos_uninstall.sh deleted file mode 100755 index 413ee958..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT1_rubbos_uninstall.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -cd /bottlenecks/rubbos/rubbos_scripts/1-1-1 -source set_bottlenecks_rubbos_env.sh - -cd $SYSSTAT_HOME -sudo make uninstall -sudo rm -rf $SYSSTAT_HOME -rm -rf $RUBBOS_HOME -#rm -rf $ELBA_TOP diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT1_uninstall.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT1_uninstall.sh deleted file mode 100755 index 36ecde18..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT1_uninstall.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -cd /bottlenecks/rubbos/rubbos_scripts/1-1-1 -source set_bottlenecks_rubbos_env.sh - -rm -rf $JAVA_HOME -#rm -rf $ELBA_TOP diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT2_configure.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT2_configure.sh deleted file mode 100755 index 4c8c416a..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT2_configure.sh +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -cd /bottlenecks/rubbos/rubbos_scripts/1-1-1 -source set_bottlenecks_rubbos_env.sh - -echo "CONFIGURING RUBBOS CLIENT on $HOSTNAME" - -cp -r $WORK_HOME/rubbos_files/Client $RUBBOS_HOME/ -cp -r $WORK_HOME/rubbos_files/bench $RUBBOS_HOME/ - -cp $OUTPUT_HOME/rubbos_conf/build.properties $RUBBOS_HOME/ -cp $OUTPUT_HOME/rubbos_conf/config.mk $RUBBOS_HOME/ -cp $OUTPUT_HOME/rubbos_conf/Makefile $RUBBOS_HOME/ - -cp $OUTPUT_HOME/rubbos_conf/rubbos-servletsBO.sh $RUBBOS_HOME/bench/ -cp $OUTPUT_HOME/rubbos_conf/rubbos-servletsRW.sh $RUBBOS_HOME/bench/ - -chmod ug+x $RUBBOS_HOME/bench/*.sh - -#build clients -echo "COMPILING RUBBOS CLIENT on $HOSTNAME" -cd $RUBBOS_HOME/Client -make clean >/dev/null -make >/dev/null 2>&1 - -echo "DONE CONFIGURING RUBBOS CLIENT on $HOSTNAME" diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT2_install.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT2_install.sh deleted file mode 100755 index f516b061..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT2_install.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -cd /bottlenecks/rubbos/rubbos_scripts/1-1-1 -source set_bottlenecks_rubbos_env.sh - -echo "INSTALLING RUBBOS CLIENT on $HOSTNAME" - -if [ ! -d "$RUBBOS_APP" ]; then -mkdir -p $RUBBOS_APP -chmod 755 $RUBBOS_APP -fi - -tar xzf $SOFTWARE_HOME/$JAVA_TARBALL --directory=$RUBBOS_APP - -echo "DONE INSTALLING RUBBOS CLIENT on $HOSTNAME" diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT2_pkg_prepare.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT2_pkg_prepare.sh deleted file mode 100755 index 7dfd60d9..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT2_pkg_prepare.sh +++ /dev/null @@ -1,45 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -. ../set_bottlenecks_rubbos_env.sh - -scp_options="-o StrictHostKeyChecking=no -o BatchMode=yes" - -# Packages for CLIENT2 rubbos install -if true; then -ssh $CLIENT2_HOST "mkdir -p /bottlenecks/rubbos/rubbos_scripts/1-1-1" -scp $scp_options ../set_bottlenecks_rubbos_env.sh $CLIENT2_HOST:/bottlenecks/rubbos/rubbos_scripts/1-1-1 - -ssh $CLIENT2_HOST "mkdir -p $SOFTWARE_HOME" -scp $scp_options $SOFTWARE_HOME/$RUBBOS_TARBALL $CLIENT2_HOST:$SOFTWARE_HOME/$RUBBOS_TARBALL -scp $scp_options $SOFTWARE_HOME/flush_cache $CLIENT2_HOST:$SOFTWARE_HOME/flush_cache -scp $scp_options $SOFTWARE_HOME/$SYSSTAT_TARBALL $CLIENT2_HOST:$SOFTWARE_HOME/$SYSSTAT_TARBALL -ssh $CLIENT2_HOST "mkdir -p $OUTPUT_HOME/rubbos_conf" -scp $scp_options $OUTPUT_HOME/rubbos_conf/cpu_mem.sh $CLIENT2_HOST:$OUTPUT_HOME/rubbos_conf/cpu_mem.sh -fi - -# Packages for CLIENT2 install -if true; then -scp $scp_options $SOFTWARE_HOME/$JAVA_TARBALL $CLIENT2_HOST:$SOFTWARE_HOME/$JAVA_TARBALL -fi - -# Packages for CLIENT2 configure -if true; then -ssh $CLIENT2_HOST "mkdir -p $WORK_HOME/rubbos_files" -scp $scp_options -r $WORK_HOME/rubbos_files/Client $CLIENT2_HOST:$WORK_HOME/rubbos_files -scp $scp_options -r $WORK_HOME/rubbos_files/bench $CLIENT2_HOST:$WORK_HOME/rubbos_files -ssh $CLIENT2_HOST "mkdir -p $OUTPUT_HOME/rubbos_conf" -for i in build.properties config.mk Makefile \ - rubbos-servletsBO.sh rubbos-servletsRW.sh -do - scp $scp_options -r $OUTPUT_HOME/rubbos_conf/$i $CLIENT2_HOST:$OUTPUT_HOME/rubbos_conf/$i -done -fi - diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT2_rubbos_install.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT2_rubbos_install.sh deleted file mode 100755 index 6f2555aa..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT2_rubbos_install.sh +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -cd /bottlenecks/rubbos/rubbos_scripts/1-1-1 -source set_bottlenecks_rubbos_env.sh - -echo "INSTALLING RUBBOS/SYSSTAT on $HOSTNAME" - -if [ ! -d "$RUBBOS_APP" ]; then -mkdir -p $RUBBOS_APP -chmod 755 $RUBBOS_APP -fi - -# install RUBBoS -tar xzf $SOFTWARE_HOME/$RUBBOS_TARBALL --directory=$RUBBOS_APP -#tar xzf $SOFTWARE_HOME/rubbos_html.tar.gz --directory=$RUBBOS_HOME/Servlet_HTML/ -cp $SOFTWARE_HOME/flush_cache $RUBBOS_HOME/bench/. - -# install sysstat -tar xzf $SOFTWARE_HOME/$SYSSTAT_TARBALL --directory=$RUBBOS_APP - -cd $SYSSTAT_HOME -./configure --prefix=$SYSSTAT_HOME >/dev/null -make >/dev/null 2>&1 -sudo make install >/dev/null - -# install a script to collect statistics data -cp $OUTPUT_HOME/rubbos_conf/cpu_mem.sh $RUBBOS_APP/. -chmod 755 $RUBBOS_APP/cpu_mem.sh - -echo "DONE INSTALLING RUBBOS/SYSSTAT on $HOSTNAME" diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT2_rubbos_uninstall.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT2_rubbos_uninstall.sh deleted file mode 100755 index 413ee958..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT2_rubbos_uninstall.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -cd /bottlenecks/rubbos/rubbos_scripts/1-1-1 -source set_bottlenecks_rubbos_env.sh - -cd $SYSSTAT_HOME -sudo make uninstall -sudo rm -rf $SYSSTAT_HOME -rm -rf $RUBBOS_HOME -#rm -rf $ELBA_TOP diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT2_uninstall.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT2_uninstall.sh deleted file mode 100755 index 36ecde18..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT2_uninstall.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -cd /bottlenecks/rubbos/rubbos_scripts/1-1-1 -source set_bottlenecks_rubbos_env.sh - -rm -rf $JAVA_HOME -#rm -rf $ELBA_TOP diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT3_configure.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT3_configure.sh deleted file mode 100755 index 4c8c416a..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT3_configure.sh +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -cd /bottlenecks/rubbos/rubbos_scripts/1-1-1 -source set_bottlenecks_rubbos_env.sh - -echo "CONFIGURING RUBBOS CLIENT on $HOSTNAME" - -cp -r $WORK_HOME/rubbos_files/Client $RUBBOS_HOME/ -cp -r $WORK_HOME/rubbos_files/bench $RUBBOS_HOME/ - -cp $OUTPUT_HOME/rubbos_conf/build.properties $RUBBOS_HOME/ -cp $OUTPUT_HOME/rubbos_conf/config.mk $RUBBOS_HOME/ -cp $OUTPUT_HOME/rubbos_conf/Makefile $RUBBOS_HOME/ - -cp $OUTPUT_HOME/rubbos_conf/rubbos-servletsBO.sh $RUBBOS_HOME/bench/ -cp $OUTPUT_HOME/rubbos_conf/rubbos-servletsRW.sh $RUBBOS_HOME/bench/ - -chmod ug+x $RUBBOS_HOME/bench/*.sh - -#build clients -echo "COMPILING RUBBOS CLIENT on $HOSTNAME" -cd $RUBBOS_HOME/Client -make clean >/dev/null -make >/dev/null 2>&1 - -echo "DONE CONFIGURING RUBBOS CLIENT on $HOSTNAME" diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT3_install.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT3_install.sh deleted file mode 100755 index f516b061..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT3_install.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -cd /bottlenecks/rubbos/rubbos_scripts/1-1-1 -source set_bottlenecks_rubbos_env.sh - -echo "INSTALLING RUBBOS CLIENT on $HOSTNAME" - -if [ ! -d "$RUBBOS_APP" ]; then -mkdir -p $RUBBOS_APP -chmod 755 $RUBBOS_APP -fi - -tar xzf $SOFTWARE_HOME/$JAVA_TARBALL --directory=$RUBBOS_APP - -echo "DONE INSTALLING RUBBOS CLIENT on $HOSTNAME" diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT3_pkg_prepare.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT3_pkg_prepare.sh deleted file mode 100755 index f958638f..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT3_pkg_prepare.sh +++ /dev/null @@ -1,45 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -. ../set_bottlenecks_rubbos_env.sh - -scp_options="-o StrictHostKeyChecking=no -o BatchMode=yes" - -# Packages for CLIENT3 rubbos install -if true; then -ssh $CLIENT3_HOST "mkdir -p /bottlenecks/rubbos/rubbos_scripts/1-1-1" -scp $scp_options ../set_bottlenecks_rubbos_env.sh $CLIENT3_HOST:/bottlenecks/rubbos/rubbos_scripts/1-1-1 - -ssh $CLIENT3_HOST "mkdir -p $SOFTWARE_HOME" -scp $scp_options $SOFTWARE_HOME/$RUBBOS_TARBALL $CLIENT3_HOST:$SOFTWARE_HOME/$RUBBOS_TARBALL -scp $scp_options $SOFTWARE_HOME/flush_cache $CLIENT3_HOST:$SOFTWARE_HOME/flush_cache -scp $scp_options $SOFTWARE_HOME/$SYSSTAT_TARBALL $CLIENT3_HOST:$SOFTWARE_HOME/$SYSSTAT_TARBALL -ssh $CLIENT3_HOST "mkdir -p $OUTPUT_HOME/rubbos_conf" -scp $scp_options $OUTPUT_HOME/rubbos_conf/cpu_mem.sh $CLIENT3_HOST:$OUTPUT_HOME/rubbos_conf/cpu_mem.sh -fi - -# Packages for CLIENT3 install -if true; then -scp $scp_options $SOFTWARE_HOME/$JAVA_TARBALL $CLIENT3_HOST:$SOFTWARE_HOME/$JAVA_TARBALL -fi - -# Packages for CLIENT3 configure -if true; then -ssh $CLIENT3_HOST "mkdir -p $WORK_HOME/rubbos_files" -scp $scp_options -r $WORK_HOME/rubbos_files/Client $CLIENT3_HOST:$WORK_HOME/rubbos_files -scp $scp_options -r $WORK_HOME/rubbos_files/bench $CLIENT3_HOST:$WORK_HOME/rubbos_files -ssh $CLIENT3_HOST "mkdir -p $OUTPUT_HOME/rubbos_conf" -for i in build.properties config.mk Makefile \ - rubbos-servletsBO.sh rubbos-servletsRW.sh -do - scp $scp_options -r $OUTPUT_HOME/rubbos_conf/$i $CLIENT3_HOST:$OUTPUT_HOME/rubbos_conf/$i -done -fi - diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT3_rubbos_install.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT3_rubbos_install.sh deleted file mode 100755 index 6f2555aa..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT3_rubbos_install.sh +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -cd /bottlenecks/rubbos/rubbos_scripts/1-1-1 -source set_bottlenecks_rubbos_env.sh - -echo "INSTALLING RUBBOS/SYSSTAT on $HOSTNAME" - -if [ ! -d "$RUBBOS_APP" ]; then -mkdir -p $RUBBOS_APP -chmod 755 $RUBBOS_APP -fi - -# install RUBBoS -tar xzf $SOFTWARE_HOME/$RUBBOS_TARBALL --directory=$RUBBOS_APP -#tar xzf $SOFTWARE_HOME/rubbos_html.tar.gz --directory=$RUBBOS_HOME/Servlet_HTML/ -cp $SOFTWARE_HOME/flush_cache $RUBBOS_HOME/bench/. - -# install sysstat -tar xzf $SOFTWARE_HOME/$SYSSTAT_TARBALL --directory=$RUBBOS_APP - -cd $SYSSTAT_HOME -./configure --prefix=$SYSSTAT_HOME >/dev/null -make >/dev/null 2>&1 -sudo make install >/dev/null - -# install a script to collect statistics data -cp $OUTPUT_HOME/rubbos_conf/cpu_mem.sh $RUBBOS_APP/. -chmod 755 $RUBBOS_APP/cpu_mem.sh - -echo "DONE INSTALLING RUBBOS/SYSSTAT on $HOSTNAME" diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT3_rubbos_uninstall.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT3_rubbos_uninstall.sh deleted file mode 100755 index 413ee958..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT3_rubbos_uninstall.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -cd /bottlenecks/rubbos/rubbos_scripts/1-1-1 -source set_bottlenecks_rubbos_env.sh - -cd $SYSSTAT_HOME -sudo make uninstall -sudo rm -rf $SYSSTAT_HOME -rm -rf $RUBBOS_HOME -#rm -rf $ELBA_TOP diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT3_uninstall.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT3_uninstall.sh deleted file mode 100755 index 36ecde18..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT3_uninstall.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -cd /bottlenecks/rubbos/rubbos_scripts/1-1-1 -source set_bottlenecks_rubbos_env.sh - -rm -rf $JAVA_HOME -#rm -rf $ELBA_TOP diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT4_configure.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT4_configure.sh deleted file mode 100755 index 4c8c416a..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT4_configure.sh +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -cd /bottlenecks/rubbos/rubbos_scripts/1-1-1 -source set_bottlenecks_rubbos_env.sh - -echo "CONFIGURING RUBBOS CLIENT on $HOSTNAME" - -cp -r $WORK_HOME/rubbos_files/Client $RUBBOS_HOME/ -cp -r $WORK_HOME/rubbos_files/bench $RUBBOS_HOME/ - -cp $OUTPUT_HOME/rubbos_conf/build.properties $RUBBOS_HOME/ -cp $OUTPUT_HOME/rubbos_conf/config.mk $RUBBOS_HOME/ -cp $OUTPUT_HOME/rubbos_conf/Makefile $RUBBOS_HOME/ - -cp $OUTPUT_HOME/rubbos_conf/rubbos-servletsBO.sh $RUBBOS_HOME/bench/ -cp $OUTPUT_HOME/rubbos_conf/rubbos-servletsRW.sh $RUBBOS_HOME/bench/ - -chmod ug+x $RUBBOS_HOME/bench/*.sh - -#build clients -echo "COMPILING RUBBOS CLIENT on $HOSTNAME" -cd $RUBBOS_HOME/Client -make clean >/dev/null -make >/dev/null 2>&1 - -echo "DONE CONFIGURING RUBBOS CLIENT on $HOSTNAME" diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT4_install.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT4_install.sh deleted file mode 100755 index f516b061..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT4_install.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -cd /bottlenecks/rubbos/rubbos_scripts/1-1-1 -source set_bottlenecks_rubbos_env.sh - -echo "INSTALLING RUBBOS CLIENT on $HOSTNAME" - -if [ ! -d "$RUBBOS_APP" ]; then -mkdir -p $RUBBOS_APP -chmod 755 $RUBBOS_APP -fi - -tar xzf $SOFTWARE_HOME/$JAVA_TARBALL --directory=$RUBBOS_APP - -echo "DONE INSTALLING RUBBOS CLIENT on $HOSTNAME" diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT4_pkg_prepare.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT4_pkg_prepare.sh deleted file mode 100755 index 5f218269..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT4_pkg_prepare.sh +++ /dev/null @@ -1,45 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -. ../set_bottlenecks_rubbos_env.sh - -scp_options="-o StrictHostKeyChecking=no -o BatchMode=yes" - -# Packages for CLIENT4 rubbos install -if true; then -ssh $CLIENT4_HOST "mkdir -p /bottlenecks/rubbos/rubbos_scripts/1-1-1" -scp $scp_options ../set_bottlenecks_rubbos_env.sh $CLIENT4_HOST:/bottlenecks/rubbos/rubbos_scripts/1-1-1 - -ssh $CLIENT4_HOST "mkdir -p $SOFTWARE_HOME" -scp $scp_options $SOFTWARE_HOME/$RUBBOS_TARBALL $CLIENT4_HOST:$SOFTWARE_HOME/$RUBBOS_TARBALL -scp $scp_options $SOFTWARE_HOME/flush_cache $CLIENT4_HOST:$SOFTWARE_HOME/flush_cache -scp $scp_options $SOFTWARE_HOME/$SYSSTAT_TARBALL $CLIENT4_HOST:$SOFTWARE_HOME/$SYSSTAT_TARBALL -ssh $CLIENT4_HOST "mkdir -p $OUTPUT_HOME/rubbos_conf" -scp $scp_options $OUTPUT_HOME/rubbos_conf/cpu_mem.sh $CLIENT4_HOST:$OUTPUT_HOME/rubbos_conf/cpu_mem.sh -fi - -# Packages for CLIENT4 install -if true; then -scp $scp_options $SOFTWARE_HOME/$JAVA_TARBALL $CLIENT4_HOST:$SOFTWARE_HOME/$JAVA_TARBALL -fi - -# Packages for CLIENT4 configure -if true; then -ssh $CLIENT4_HOST "mkdir -p $WORK_HOME/rubbos_files" -scp $scp_options -r $WORK_HOME/rubbos_files/Client $CLIENT4_HOST:$WORK_HOME/rubbos_files -scp $scp_options -r $WORK_HOME/rubbos_files/bench $CLIENT4_HOST:$WORK_HOME/rubbos_files -ssh $CLIENT4_HOST "mkdir -p $OUTPUT_HOME/rubbos_conf" -for i in build.properties config.mk Makefile \ - rubbos-servletsBO.sh rubbos-servletsRW.sh -do - scp $scp_options -r $OUTPUT_HOME/rubbos_conf/$i $CLIENT4_HOST:$OUTPUT_HOME/rubbos_conf/$i -done -fi - diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT4_rubbos_install.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT4_rubbos_install.sh deleted file mode 100755 index 6f2555aa..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT4_rubbos_install.sh +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -cd /bottlenecks/rubbos/rubbos_scripts/1-1-1 -source set_bottlenecks_rubbos_env.sh - -echo "INSTALLING RUBBOS/SYSSTAT on $HOSTNAME" - -if [ ! -d "$RUBBOS_APP" ]; then -mkdir -p $RUBBOS_APP -chmod 755 $RUBBOS_APP -fi - -# install RUBBoS -tar xzf $SOFTWARE_HOME/$RUBBOS_TARBALL --directory=$RUBBOS_APP -#tar xzf $SOFTWARE_HOME/rubbos_html.tar.gz --directory=$RUBBOS_HOME/Servlet_HTML/ -cp $SOFTWARE_HOME/flush_cache $RUBBOS_HOME/bench/. - -# install sysstat -tar xzf $SOFTWARE_HOME/$SYSSTAT_TARBALL --directory=$RUBBOS_APP - -cd $SYSSTAT_HOME -./configure --prefix=$SYSSTAT_HOME >/dev/null -make >/dev/null 2>&1 -sudo make install >/dev/null - -# install a script to collect statistics data -cp $OUTPUT_HOME/rubbos_conf/cpu_mem.sh $RUBBOS_APP/. -chmod 755 $RUBBOS_APP/cpu_mem.sh - -echo "DONE INSTALLING RUBBOS/SYSSTAT on $HOSTNAME" diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT4_rubbos_uninstall.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT4_rubbos_uninstall.sh deleted file mode 100755 index 413ee958..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT4_rubbos_uninstall.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -cd /bottlenecks/rubbos/rubbos_scripts/1-1-1 -source set_bottlenecks_rubbos_env.sh - -cd $SYSSTAT_HOME -sudo make uninstall -sudo rm -rf $SYSSTAT_HOME -rm -rf $RUBBOS_HOME -#rm -rf $ELBA_TOP diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT4_uninstall.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT4_uninstall.sh deleted file mode 100755 index 36ecde18..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CLIENT4_uninstall.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -cd /bottlenecks/rubbos/rubbos_scripts/1-1-1 -source set_bottlenecks_rubbos_env.sh - -rm -rf $JAVA_HOME -#rm -rf $ELBA_TOP diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CONTROL_checkScp_exec.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CONTROL_checkScp_exec.sh deleted file mode 100755 index 1cfb0bc7..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CONTROL_checkScp_exec.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -cd /bottlenecks/rubbos/rubbos_scripts/1-1-1 -source set_bottlenecks_rubbos_env.sh - -# Check scp to all servers -echo "*** checking scp to all servers *********************************" - -ssh -o StrictHostKeyChecking=no -o BatchMode=yes $CONTROL_HOST "hostname" -ssh -o StrictHostKeyChecking=no -o BatchMode=yes $BENCHMARK_HOST "hostname" -ssh -o StrictHostKeyChecking=no -o BatchMode=yes $CLIENT1_HOST "hostname" -ssh -o StrictHostKeyChecking=no -o BatchMode=yes $CLIENT2_HOST "hostname" -ssh -o StrictHostKeyChecking=no -o BatchMode=yes $CLIENT3_HOST "hostname" -ssh -o StrictHostKeyChecking=no -o BatchMode=yes $CLIENT4_HOST "hostname" -ssh -o StrictHostKeyChecking=no -o BatchMode=yes $HTTPD_HOST "hostname" -ssh -o StrictHostKeyChecking=no -o BatchMode=yes $TOMCAT1_HOST "hostname" -ssh -o StrictHostKeyChecking=no -o BatchMode=yes $MYSQL1_HOST "hostname" - -#ssh -o StrictHostKeyChecking=no -o BatchMode=yes bonn.cc.gt.atl.ga.us "hostname" -ssh -o StrictHostKeyChecking=no -o BatchMode=yes localhost "hostname" diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CONTROL_emulabConf_exec.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CONTROL_emulabConf_exec.sh deleted file mode 100755 index 428172ab..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CONTROL_emulabConf_exec.sh +++ /dev/null @@ -1,63 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -cd /bottlenecks/rubbos/rubbos_scripts/1-1-1 -source set_bottlenecks_rubbos_env.sh - -# Limit pc3000 Memory Capacity - -sleep 10 - -# Make and mount new partiton -echo "*** make FS on a partition and mount it *************************" - -for i in "$BENCHMARK_HOST" "$CLIENT1_HOST" "$CLIENT2_HOST" "$CLIENT3_HOST" "$CLIENT4_HOST" "$HTTPD_HOST" "$TOMCAT1_HOST" "$MYSQL1_HOST" -do -ssh $i " - sudo mkdir -p $ELBA_TOP - sudo chmod 777 $ELBA_TOP -" -scp $WORK_HOME/emulab_files/limits.conf $i:$ELBA_TOP -scp $WORK_HOME/emulab_files/login $i:$ELBA_TOP -scp $WORK_HOME/emulab_files/file-max $i:$ELBA_TOP - -ssh $i " - sudo mv $ELBA_TOP/limits.conf /etc/security/ - sudo mv $ELBA_TOP/login /etc/pam.d/ -" -done - - -for i in "$BENCHMARK_HOST" "$CLIENT1_HOST" "$CLIENT2_HOST" "$CLIENT3_HOST" "$CLIENT4_HOST" "$HTTPD_HOST" "$TOMCAT1_HOST" "$MYSQL1_HOST" -do - ssh $i " - sudo /sbin/mkfs /dev/sda4 - sudo mount /dev/sda4 $ELBA_TOP - sudo chmod 777 $ELBA_TOP - mkdir -p $RUBBOS_TOP - sudo cp $SOFTWARE_HOME/sdparm-1.03.tgz /tmp - cd /tmp - sudo tar -zxvf ./sdparm-1.03.tgz - cd sdparm-1.03 - sudo ./configure - sudo make - sudo make install - sudo sdparm -c WCE /dev/sda - " & -done - -echo "sleep 420" -sleep 420 -echo "wake up from sleeping 420" - - -# Turning off Swap Partition - -sleep 10 diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CONTROL_rubbos_exec.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CONTROL_rubbos_exec.sh deleted file mode 100755 index 77da6459..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/CONTROL_rubbos_exec.sh +++ /dev/null @@ -1,151 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -set -x - -cd /bottlenecks/rubbos/rubbos_scripts/1-1-1 -source set_bottlenecks_rubbos_env.sh -export scp_options='-o StrictHostKeyChecking=no -o BatchMode=yes' - -scp $WORK_HOME/monitors_files/oprofile_start.sh $MYSQL1_HOST:/tmp/ - -echo "Starting RUBBoS" - -ssh $RUBBOS_RESULTS_HOST " - mkdir -p $RUBBOS_RESULTS_DIR_BASE -" -ssh $BENCHMARK_HOST " - mkdir -p $TMP_RESULTS_DIR_BASE/$RUBBOS_RESULTS_DIR_NAME -" - -# run test rubbos.properties from 200 to 3200 -for i in {2..32..5} -do - echo "Start Browsing Only with rubbos.properties_$((100*i)) $(date)" - - ssh $BENCHMARK_HOST " - source /bottlenecks/rubbos/rubbos_scripts/1-1-1/set_bottlenecks_rubbos_env.sh - rm -f $RUBBOS_HOME/Client/rubbos.properties - " - - sed -e "s/REPLACE_HTTPD_HOST/$HTTPD_HOST/g" \ - -e "s/REPLACE_TOMCAT1_HOST/$TOMCAT1_HOST/g" \ - -e "s/REPLACE_MYSQL1_HOST/$MYSQL1_HOST/g" \ - -e "s#REPLACE_CLIENT1_HOST#$CLIENT1_HOST#g" \ - -e "s#REPLACE_CLIENT2_HOST#$CLIENT2_HOST#g" \ - -e "s#REPLACE_CLIENT3_HOST#$CLIENT3_HOST#g" \ - -e "s#REPLACE_CLIENT4_HOST#$CLIENT4_HOST#g" \ - -e "s/REPLACE_NUMBER_OF_CLIENTS_PER_NODE/$((20*i))/g" \ - $OUTPUT_HOME/rubbos_conf/rubbos.properties_template \ - > $OUTPUT_HOME/rubbos_conf/rubbos.properties - scp $OUTPUT_HOME/rubbos_conf/rubbos.properties $BENCHMARK_HOST:$RUBBOS_HOME/Client/rubbos.properties - rm -rf $OUTPUT_HOME/rubbos_conf/rubbos.properties - - echo "Resetting all data" - $OUTPUT_HOME/scripts/reset_all.sh - - # Browsing Only - echo "Start Browsing Only with rubbos.properties_$((100*i))" - echo "Removing previous logs..." - ssh $HTTPD_HOST "rm -f $HTTPD_HOME/logs/*log" - ssh $TOMCAT1_HOST "rm -f $CATALINA_HOME/logs/*" - ssh $MYSQL1_HOST "rm -f $MYSQL_HOME/run/*.log $RUBBOS_APP/mysql_mon-*" - - $OUTPUT_HOME/scripts/start_all.sh - sleep 15 - - for host in $BENCHMARK_HOST $CLIENT1_HOST $CLIENT2_HOST $CLIENT3_HOST \ - $CLIENT4_HOST $HTTPD_HOST $TOMCAT1_HOST $MYSQL1_HOST - do - ssh $host "rm -f $RUBBOS_APP/sar-* $RUBBOS_APP/ps-* $RUBBOS_APP/iostat-*" - done - ssh $MYSQL1_HOST "rm -f /tmp/*.log" - ssh $MYSQL1_HOST chmod 777 /tmp/oprofile_start.sh - #ssh $MYSQL1_HOST " - # cd /tmp - # ./oprofile_start.sh - #" & - - ssh $BENCHMARK_HOST " - set -x - source /bottlenecks/rubbos/rubbos_scripts/1-1-1/set_bottlenecks_rubbos_env.sh - - cd $RUBBOS_HOME/bench - \rm -r 20* - - # Execute benchmark - echo "execute benchmark" - ./rubbos-servletsBO.sh - - # Collect results - echo "The benchmark has finished. Now, collecting results..." - cd 20* - for host in $BENCHMARK_HOST $CLIENT1_HOST $CLIENT2_HOST $CLIENT3_HOST \ - $CLIENT4_HOST $HTTPD_HOST $TOMCAT1_HOST $MYSQL1_HOST - do - for f in 'sar-*' 'ps-*' 'iostat-*' 'mysql_mon-*' 'postgres_lock-*' - do - scp $scp_options \$host:$RUBBOS_APP/\$f ./ - done - done - cd .. - find -type f - find -type f | grep stat_client | xargs grep throughput - mv 20* $TMP_RESULTS_DIR_BASE/$RUBBOS_RESULTS_DIR_NAME/ - " - - $OUTPUT_HOME/scripts/stop_all.sh - $OUTPUT_HOME/scripts/kill_all.sh - sleep 15 - - echo "End Browsing Only with rubbos.properties_$((100*i)) $(date)" -done - -echo "Processing the results..." -ssh $BENCHMARK_HOST " - cd $TMP_RESULTS_DIR_BASE - #cd $RUBBOS_RESULTS_DIR_NAME - #scp $RUBBOS_RESULTS_HOST:$RUBBOS_RESULTS_DIR_BASE/calc-sarSummary.prl ../ - #../calc-sarSummary.prl - - #rm -f 20*/*.bin - - #cd ../ - tar zcf $RUBBOS_RESULTS_DIR_NAME.tgz $RUBBOS_RESULTS_DIR_NAME - scp $scp_options $RUBBOS_RESULTS_DIR_NAME.tgz $RUBBOS_RESULTS_HOST:$RUBBOS_RESULTS_DIR_BASE/ -" - -echo "Push the results to DB..." -cd $RUBBOS_RESULTS_DIR_BASE - -ls $RUBBOS_RESULTS_DIR_NAME.tgz -tar zxf $RUBBOS_RESULTS_DIR_NAME.tgz -ls $RUBBOS_RESULTS_DIR_NAME - -echo "Fetch POD env parameters" -source /tmp/vm_dev_setup/hosts.conf -sed -i -e "s/REPLACE_NODE_NAME/$NODE_NAME/g" \ - -e "s/REPLACE_INSTALLER_TYPE/$INSTALLER_TYPE/g" \ - -e "s/REPLACE_VERSION/$BOTTLENECKS_VERSION/g" \ - -e "s#REPLACE_BOTTLENECKS_DB_TARGET#$BOTTLENECKS_DB_TARGET#g" \ - $BOTTLENECKS_TOP/utils/dashboard/dashboard.yaml - -cat $BOTTLENECKS_TOP/utils/dashboard/dashboard.yaml - -python $BOTTLENECKS_TOP/utils/dashboard/process_data.py \ - $RUBBOS_RESULTS_DIR_BASE/$RUBBOS_RESULTS_DIR_NAME \ - $BOTTLENECKS_TOP/utils/dashboard/dashboard.yaml -cd - - -echo "Finish RUBBoS" -touch /tmp/rubbos_finished - -set +x - diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/HTTPD_configure.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/HTTPD_configure.sh deleted file mode 100755 index 2cacf966..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/HTTPD_configure.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -cd /bottlenecks/rubbos/rubbos_scripts/1-1-1 -source set_bottlenecks_rubbos_env.sh - -echo "CONFIGURING APACHE on $HOSTNAME" - -cp $OUTPUT_HOME/apache_conf/httpd.conf $HTTPD_HOME/conf/ -cp $OUTPUT_HOME/apache_conf/workers.properties $HTTPD_HOME/conf/ -cp -r $WORK_HOME/apache_files/rubbos_html $HTTPD_HOME/htdocs/rubbos - -apache > /dev/null 2>&1 - -echo "APACHE CONFIGURED SUCCESSFULLY on $HOSTNAME" - - - diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/HTTPD_ignition.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/HTTPD_ignition.sh deleted file mode 100755 index 74850b65..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/HTTPD_ignition.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -cd /bottlenecks/rubbos/rubbos_scripts/1-1-1 -source set_bottlenecks_rubbos_env.sh - -echo "STARTING APACHE on $HOSTNAME" - -$HTTPD_HOME/bin/apachectl -f $HTTPD_HOME/conf/httpd.conf -k start - -echo "APACHE IS RUNNING on $HOSTNAME" - diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/HTTPD_install.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/HTTPD_install.sh deleted file mode 100755 index 1370bc77..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/HTTPD_install.sh +++ /dev/null @@ -1,44 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -cd /bottlenecks/rubbos/rubbos_scripts/1-1-1 -source set_bottlenecks_rubbos_env.sh - -echo "INSTALLING APACHE on $HOSTNAME" - -echo "Adding new user apache begin" -useradd apache -groupadd apache -usermod -G apache apache -echo "Adding new user apache end" - -mkdir -p $BOTTLENECKS_TOP -chmod 755 $BOTTLENECKS_TOP -mkdir -p $RUBBOS_TOP -chmod 755 $RUBBOS_TOP -mkdir -p $RUBBOS_APP -chmod 755 $RUBBOS_APP - -# apache -tar zxf $SOFTWARE_HOME/$HTTPD_TARBALL --directory=$RUBBOS_APP -cd $HTTPD_INSTALL_FILES -./configure --prefix=$HTTPD_HOME --enable-module=so --enable-so --with-mpm=worker >/dev/null -make >/dev/null -make install >/dev/null - -# mod jk -tar zxf $SOFTWARE_HOME/$MOD_JK_TARBALL --directory=$RUBBOS_APP -tar zxf $SOFTWARE_HOME/$JAVA_TARBALL --directory=$RUBBOS_APP -cd $MOD_JK_INSTALL_CONFIGURE -./configure --with-apxs=$HTTPD_HOME/bin/apxs --enable-jni --with-java-home=$JAVA_HOME >/dev/null -make >/dev/null -make install >/dev/null - -echo "APACHE IS INSTALLED on $HOSTNAME" diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/HTTPD_pkg_prepare.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/HTTPD_pkg_prepare.sh deleted file mode 100755 index 4dd116aa..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/HTTPD_pkg_prepare.sh +++ /dev/null @@ -1,50 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -. ../set_bottlenecks_rubbos_env.sh - -scp_options="-o StrictHostKeyChecking=no -o BatchMode=yes" - -# Packages for HTTPD install -if true; then -ssh $HTTPD_HOST "mkdir -p /bottlenecks/rubbos/rubbos_scripts/1-1-1" -scp $scp_options ../set_bottlenecks_rubbos_env.sh $HTTPD_HOST:/bottlenecks/rubbos/rubbos_scripts/1-1-1 - -ssh $HTTPD_HOST "mkdir -p $SOFTWARE_HOME" -scp $scp_options $SOFTWARE_HOME/$HTTPD_TARBALL $HTTPD_HOST:$SOFTWARE_HOME/$HTTPD_TARBALL -scp $scp_options $SOFTWARE_HOME/$MOD_JK_TARBALL $HTTPD_HOST:$SOFTWARE_HOME/$MOD_JK_TARBALL -scp $scp_options $SOFTWARE_HOME/$JAVA_TARBALL $HTTPD_HOST:$SOFTWARE_HOME/$JAVA_TARBALL - -fi - -# Packages for HTTPD rubbos install -if true; then -scp $scp_options $SOFTWARE_HOME/$RUBBOS_TARBALL $HTTPD_HOST:$SOFTWARE_HOME/$RUBBOS_TARBALL -scp $scp_options $SOFTWARE_HOME/flush_cache $HTTPD_HOST:$SOFTWARE_HOME/flush_cache -scp $scp_options $SOFTWARE_HOME/$SYSSTAT_TARBALL $HTTPD_HOST:$SOFTWARE_HOME/$SYSSTAT_TARBALL -ssh $HTTPD_HOST "mkdir -p $OUTPUT_HOME/rubbos_conf" -scp $scp_options $OUTPUT_HOME/rubbos_conf/cpu_mem.sh $HTTPD_HOST:$OUTPUT_HOME/rubbos_conf/cpu_mem.sh -fi - -# Packages for HTTPD configure -if true; then -ssh $HTTPD_HOST "mkdir -p $OUTPUT_HOME/apache_conf" -scp $scp_options $OUTPUT_HOME/apache_conf/httpd.conf $HTTPD_HOST:$OUTPUT_HOME/apache_conf/httpd.conf - -sed -e "s/REPLACE_TOMCAT1_HOST/$TOMCAT1_HOST/g" \ - $OUTPUT_HOME/apache_conf/workers.properties_template \ - > $OUTPUT_HOME/apache_conf/workers.properties -scp $scp_options $OUTPUT_HOME/apache_conf/workers.properties $HTTPD_HOST:$OUTPUT_HOME/apache_conf/workers.properties -rm -rf $OUTPUT_HOME/apache_conf/workers.properties - -ssh $HTTPD_HOST "mkdir -p $WORK_HOME/apache_files" -scp $scp_options -r $WORK_HOME/apache_files/rubbos_html $HTTPD_HOST:$WORK_HOME/apache_files/rubbos_html -fi - diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/HTTPD_rubbos_install.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/HTTPD_rubbos_install.sh deleted file mode 100755 index 29316c57..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/HTTPD_rubbos_install.sh +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -cd /bottlenecks/rubbos/rubbos_scripts/1-1-1 -source set_bottlenecks_rubbos_env.sh - -echo "INSTALLING RUBBOS/SYSSTAT on $HOSTNAME" - -mkdir -p $RUBBOS_APP - -# install RUBBoS -tar xzf $SOFTWARE_HOME/$RUBBOS_TARBALL --directory=$RUBBOS_APP -cp $SOFTWARE_HOME/flush_cache $RUBBOS_HOME/bench/. - -# install sysstat -tar xzf $SOFTWARE_HOME/$SYSSTAT_TARBALL --directory=$RUBBOS_APP - -cd $SYSSTAT_HOME -./configure --prefix=$SYSSTAT_HOME >/dev/null -make >/dev/null 2>&1 -sudo make install >/dev/null - -# install a script to collect statistics data -cp $OUTPUT_HOME/rubbos_conf/cpu_mem.sh $RUBBOS_APP/. -chmod 755 $RUBBOS_APP/cpu_mem.sh - -echo "DONE INSTALLING RUBBOS/SYSSTAT on $HOSTNAME" diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/HTTPD_rubbos_uninstall.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/HTTPD_rubbos_uninstall.sh deleted file mode 100755 index 71cefa44..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/HTTPD_rubbos_uninstall.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -cd /bottlenecks/rubbos/rubbos_scripts/1-1-1 -source set_bottlenecks_rubbos_env.sh - -cd $SYSSTAT_HOME -sudo make uninstall -sudo rm -rf $SYSSTAT_HOME -rm -rf $RUBBOS_APP diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/HTTPD_stop.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/HTTPD_stop.sh deleted file mode 100755 index 515ecea2..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/HTTPD_stop.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -cd /bottlenecks/rubbos/rubbos_scripts/1-1-1 -source set_bottlenecks_rubbos_env.sh - -echo "STOPPING APACHE on $HOSTNAME" - -$HTTPD_HOME/bin/apachectl -f $HTTPD_HOME/conf/httpd.conf -k stop - -echo "APACHE IS STOPPED on $HOSTNAME" - - diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/HTTPD_uninstall.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/HTTPD_uninstall.sh deleted file mode 100755 index 5f6cff8a..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/HTTPD_uninstall.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -cd /bottlenecks/rubbos/rubbos_scripts/1-1-1 -source set_bottlenecks_rubbos_env.sh - -rm -rf $HTTPD_INSTALL_FILES -rm -rf $HTTPD_HOME - - diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/MYSQL1_configure.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/MYSQL1_configure.sh deleted file mode 100755 index d0ff01ab..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/MYSQL1_configure.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -cd /bottlenecks/rubbos/rubbos_scripts/1-1-1 -source set_bottlenecks_rubbos_env.sh - -echo "CONFIGURING MYSQL on $HOSTNAME" - -cd $MYSQL_HOME -chown -R mysql:mysql ./ -cp support-files/my-medium.cnf /etc/my.cnf -#bin/mysqld_safe --user=$BOTTLENECKS_USER & -#bin/mysqladmin -u root password 'new-password' -cp support-files/mysql.server /etc/init.d/mysql.server -/etc/init.d/mysql.server status - -if [ -f "/usr/local/bin/mysql" ]; then -rm -rf /usr/local/bin/mysql -fi - -ln -s $MYSQL_HOME/bin/mysql /usr/local/bin/mysql - -echo "DONE CONFIGURING MYSQL on $HOSTNAME" - diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/MYSQL1_ignition.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/MYSQL1_ignition.sh deleted file mode 100755 index 946f1007..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/MYSQL1_ignition.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -cd /bottlenecks/rubbos/rubbos_scripts/1-1-1 -source set_bottlenecks_rubbos_env.sh - -echo "STARTING MYSQL on $HOSTNAME $(date)" - -cd $MYSQL_HOME -bin/mysqld_safe& -sleep 10 -/etc/init.d/mysql.server status - - -echo "MYSQL IS RUNNING on $HOSTNAME $(date)" diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/MYSQL1_install.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/MYSQL1_install.sh deleted file mode 100755 index b69cae88..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/MYSQL1_install.sh +++ /dev/null @@ -1,41 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -cd /bottlenecks/rubbos/rubbos_scripts/1-1-1 -source set_bottlenecks_rubbos_env.sh - -echo "INSTALLING MYSQL on $HOSTNAME" - -mkdir -p $BOTTLENECKS_TOP -chmod 755 $BOTTLENECKS_TOP -mkdir -p $RUBBOS_TOP -chmod 755 $RUBBOS_TOP -mkdir -p $RUBBOS_APP -chmod 755 $RUBBOS_APP - -cd /root -groupadd mysql -useradd -r -g mysql $BOTTLENECKS_USER -tar xzf $SOFTWARE_HOME/$MYSQL_TARBALL --directory=$RUBBOS_APP -cd /usr/local -ln -s $MYSQL_HOME mysql -cd mysql -chown -R $BOTTLENECKS_USER . -chgrp -R mysql . -#scripts/mysql_install_db --verbose --user=$BOTTLENECKS_USER --basedir=$MYSQL_HOME --datadir=$MYSQL_DATA_DIR -scripts/mysql_install_db --user=$BOTTLENECKS_USER -chown -R root . -chown -R $BOTTLENECKS_USER data - -#echo "begin install mysql" -#cd $MYSQL_HOME -#scripts/mysql_install_db --no-defaults --user=root --basedir=$MYSQL_HOME --port=$MYSQL_PORT --datadir=$MYSQL_DATA_DIR --log=$MYSQL_ERR_LOG --pid-file=$MYSQL_PID_FILE --socket=$MYSQL_SOCKET - -echo "DONE INSTALLING MYSQL on $HOSTNAME" diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/MYSQL1_pkg_prepare.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/MYSQL1_pkg_prepare.sh deleted file mode 100755 index cc714164..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/MYSQL1_pkg_prepare.sh +++ /dev/null @@ -1,41 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -source ../set_bottlenecks_rubbos_env.sh - -scp_options="-o StrictHostKeyChecking=no -o BatchMode=yes" - -# Packages for MYSQL1 install -echo "MYSQL PREPARE DEPENDANT LIBRARY BEGIN" -if true; then -ssh $MYSQL1_HOST "mkdir -p /bottlenecks/rubbos/rubbos_scripts/1-1-1" -scp $scp_options ../set_bottlenecks_rubbos_env.sh $MYSQL1_HOST:/bottlenecks/rubbos/rubbos_scripts/1-1-1 - -ssh $MYSQL1_HOST "mkdir -p $SOFTWARE_HOME" -scp $scp_options $SOFTWARE_HOME/$MYSQL_TARBALL $MYSQL1_HOST:$SOFTWARE_HOME/$MYSQL_TARBALL -scp $scp_options $SOFTWARE_HOME/$RUBBOS_DATA_TARBALL $MYSQL1_HOST:$SOFTWARE_HOME/$RUBBOS_DATA_TARBALL - -fi -echo "MYSQL PREPARE DEPENDANT LIBRARY END" - -# Packages for MYSQL1 rubbos install -if true; then -scp $scp_options $SOFTWARE_HOME/$RUBBOS_TARBALL $MYSQL1_HOST:$SOFTWARE_HOME/$RUBBOS_TARBALL -scp $scp_options $SOFTWARE_HOME/flush_cache $MYSQL1_HOST:$SOFTWARE_HOME/flush_cache -scp $scp_options $SOFTWARE_HOME/$SYSSTAT_TARBALL $MYSQL1_HOST:$SOFTWARE_HOME/$SYSSTAT_TARBALL -ssh $MYSQL1_HOST "mkdir -p $OUTPUT_HOME/rubbos_conf" -scp $scp_options $OUTPUT_HOME/rubbos_conf/cpu_mem.sh $MYSQL1_HOST:$OUTPUT_HOME/rubbos_conf/cpu_mem.sh -fi - -# Packages for MYSQL1 configure -if true; then -scp $scp_options $SOFTWARE_HOME/$RUBBOS_DATA_TARBALL $MYSQL1_HOST:/tmp -fi - diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/MYSQL1_reset.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/MYSQL1_reset.sh deleted file mode 100755 index da07ab36..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/MYSQL1_reset.sh +++ /dev/null @@ -1,49 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -cd /bottlenecks/rubbos/rubbos_scripts/1-1-1 -source set_bottlenecks_rubbos_env.sh - -echo "RESETING MYSQL on $HOSTNAME" -# copy rubbos data files -#tar xzf $RUBBOS_TOP/$RUBBOS_DATA_TARBALL --directory=$MYSQL_HOME/data/rubbos -cd $MYSQL_HOME -bin/mysqld_safe& -sleep 10 -/etc/init.d/mysql.server status - -echo "BEGIN RUBBOS DATABASE GIVE PRIVILEGES" -cat << EOF | mysql -uroot - -DROP DATABASE IF EXISTS rubbos; - -CREATE DATABASE rubbos; - -GRANT ALL PRIVILEGES ON rubbos.* TO 'rubbos'@'%' \ - IDENTIFIED BY 'rubbos'; - flush privileges; -GRANT ALL PRIVILEGES ON rubbos.* TO 'rubbos'@'localhost' \ - IDENTIFIED BY 'rubbos'; - flush privileges; -EOF -echo "END RUBBOS DATABASE GIVE PRIVILEGES" - -echo "BEGIN IMPORT SQL DATA $(date)" -echo "software_home=$SOFTWARE_HOME" -tar xzf $SOFTWARE_HOME/$RUBBOS_DATA_TARBALL --directory /tmp -mysql -uroot rubbos < /tmp/$RUBBOS_DATA_SQL -echo "END IMPORT SQL DATA $(date)" -rm /tmp/$RUBBOS_DATA_SQL - -bin/mysqladmin shutdown - -echo "DONE RESETING MYSQL on $HOSTNAME" -sleep 5 - diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/MYSQL1_rubbos_install.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/MYSQL1_rubbos_install.sh deleted file mode 100755 index 96a47007..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/MYSQL1_rubbos_install.sh +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -cd /bottlenecks/rubbos/rubbos_scripts/1-1-1 -source set_bottlenecks_rubbos_env.sh - -echo "INSTALLING RUBBOS/SYSSTAT on $HOSTNAME" - -mkdir -p $RUBBOS_APP - -# install RUBBoS -tar xzf $SOFTWARE_HOME/$RUBBOS_TARBALL --directory=$RUBBOS_APP -#tar xzf $SOFTWARE_HOME/rubbos_html.tar.gz --directory=$RUBBOS_HOME/Servlet_HTML/ -cp $SOFTWARE_HOME/flush_cache $RUBBOS_HOME/bench/. - -# install sysstat -tar xzf $SOFTWARE_HOME/$SYSSTAT_TARBALL --directory=$RUBBOS_APP -cd $SYSSTAT_HOME -./configure --prefix=$SYSSTAT_HOME >/dev/null -make >/dev/null 2>&1 -sudo make install >/dev/null - -# install a script to collect statistics data -cp $OUTPUT_HOME/rubbos_conf/cpu_mem.sh $RUBBOS_APP/. -chmod 755 $RUBBOS_APP/cpu_mem.sh - -echo "DONE INSTALLING RUBBOS/SYSSTAT on $HOSTNAME" diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/MYSQL1_rubbos_uninstall.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/MYSQL1_rubbos_uninstall.sh deleted file mode 100755 index d5db08a0..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/MYSQL1_rubbos_uninstall.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -cd /bottlenecks/rubbos/rubbos_scripts/1-1-1 -source set_bottlenecks_rubbos_env.sh - -cd $SYSSTAT_HOME -sudo make uninstall -sudo rm -rf $SYSSTAT_HOME -rm -rf $RUBBOS_HOME diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/MYSQL1_stop.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/MYSQL1_stop.sh deleted file mode 100755 index a41dfce8..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/MYSQL1_stop.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -cd /bottlenecks/rubbos/rubbos_scripts/1-1-1 -source set_bottlenecks_rubbos_env.sh - -echo "STOPPING MYSQL on $HOSTNAME" - -cd $MYSQL_HOME -#bin/mysqladmin --socket=$MYSQL_SOCKET --user=root --password=$ROOT_PASSWORD shutdown -bin/mysqladmin shutdown - -echo "MYSQL IS STOPPED on $HOSTNAME" diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/MYSQL1_uninstall.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/MYSQL1_uninstall.sh deleted file mode 100755 index 24aa4fbb..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/MYSQL1_uninstall.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -cd /bottlenecks/rubbos/rubbos_scripts/1-1-1 -source set_bottlenecks_rubbos_env.sh - -rm -rf $MYSQL_HOME -#rm -rf $ELBA_TOP diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/TOMCAT1_configure.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/TOMCAT1_configure.sh deleted file mode 100755 index 604de026..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/TOMCAT1_configure.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -cd /bottlenecks/rubbos/rubbos_scripts/1-1-1 -source set_bottlenecks_rubbos_env.sh - -echo "CONFIGURING TOMCAT on $HOSTNAME" - -cp $OUTPUT_HOME/tomcat_conf/server.xml $CATALINA_HOME/conf/server.xml - -echo "DONE CONFIGURING TOMCAT on $HOSTNAME" diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/TOMCAT1_ignition.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/TOMCAT1_ignition.sh deleted file mode 100755 index 88c62bec..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/TOMCAT1_ignition.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -cd /bottlenecks/rubbos/rubbos_scripts/1-1-1 -source set_bottlenecks_rubbos_env.sh - -echo "STARTING TOMCAT on $HOSTNAME" - -cd $CATALINA_HOME/bin -./startup.sh - -echo "TOMCAT IS RUNNING on $HOSTNAME" diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/TOMCAT1_install.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/TOMCAT1_install.sh deleted file mode 100755 index ddd52081..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/TOMCAT1_install.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -cd /bottlenecks/rubbos/rubbos_scripts/1-1-1 -source set_bottlenecks_rubbos_env.sh - -echo "INSTALLING TOMCAT on $HOSTNAME" - -mkdir -p $BOTTLENECKS_TOP -chmod 755 $BOTTLENECKS_TOP -mkdir -p $RUBBOS_TOP -chmod 755 $RUBBOS_TOP -mkdir -p $RUBBOS_APP -chmod 755 $RUBBOS_APP - -tar xzf $SOFTWARE_HOME/$TOMCAT_TARBALL --directory=$RUBBOS_APP -tar xzf $SOFTWARE_HOME/$JAVA_TARBALL --directory=$RUBBOS_APP -tar xzf $SOFTWARE_HOME/$J2EE_TARBALL --directory=$RUBBOS_APP -tar xzf $SOFTWARE_HOME/$ANT_TARBALL --directory=$RUBBOS_APP - -echo "DONE INSTALLING TOMCAT on $HOSTNAME" diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/TOMCAT1_pkg_prepare.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/TOMCAT1_pkg_prepare.sh deleted file mode 100755 index 7d01066f..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/TOMCAT1_pkg_prepare.sh +++ /dev/null @@ -1,59 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -. ../set_bottlenecks_rubbos_env.sh - -scp_options="-o StrictHostKeyChecking=no -o BatchMode=yes" - -# Packages for TOMCAT1 install -if true; then -ssh $TOMCAT1_HOST "mkdir -p /bottlenecks/rubbos/rubbos_scripts/1-1-1" -scp $scp_options ../set_bottlenecks_rubbos_env.sh $TOMCAT1_HOST:/bottlenecks/rubbos/rubbos_scripts/1-1-1 - -ssh $TOMCAT1_HOST "mkdir -p $SOFTWARE_HOME" - -for i in $TOMCAT_TARBALL $JAVA_TARBALL $J2EE_TARBALL $ANT_TARBALL -do - scp $scp_options $SOFTWARE_HOME/$i $TOMCAT1_HOST:$SOFTWARE_HOME/$i -done - -fi - -# Packages for TOMCAT1 rubbos install -if true; then -scp $scp_options $SOFTWARE_HOME/$RUBBOS_TARBALL $TOMCAT1_HOST:$SOFTWARE_HOME/$RUBBOS_TARBALL -scp $scp_options $SOFTWARE_HOME/flush_cache $TOMCAT1_HOST:$SOFTWARE_HOME/flush_cache -scp $scp_options $SOFTWARE_HOME/$SYSSTAT_TARBALL $TOMCAT1_HOST:$SOFTWARE_HOME/$SYSSTAT_TARBALL -ssh $TOMCAT1_HOST "mkdir -p $OUTPUT_HOME/rubbos_conf" -scp $scp_options $OUTPUT_HOME/rubbos_conf/cpu_mem.sh $TOMCAT1_HOST:$OUTPUT_HOME/rubbos_conf/cpu_mem.sh -fi - -# Packages for TOMCAT1 configure -if true; then -ssh $TOMCAT1_HOST "mkdir -p $OUTPUT_HOME/tomcat_conf" -scp $scp_options $OUTPUT_HOME/tomcat_conf/server.xml $TOMCAT1_HOST:$OUTPUT_HOME/tomcat_conf/server.xml -fi - -# Packages for TOMCAT1 rubbosSL configure -if true; then -ssh $TOMCAT1_HOST "mkdir -p $OUTPUT_HOME/rubbos_conf" -sed -e "s#REPLACE_MYSQL1_HOST#$MYSQL1_HOST#g" \ - $OUTPUT_HOME/rubbos_conf/mysql.properties_template \ - > $OUTPUT_HOME/rubbos_conf/mysql.properties -for i in build.properties mysql.properties build.xml Config.java web.xml -do - scp $scp_options $OUTPUT_HOME/rubbos_conf/$i $TOMCAT1_HOST:$OUTPUT_HOME/rubbos_conf/$i -done -rm -rf $OUTPUT_HOME/rubbos_conf/mysql.properties - -ssh $TOMCAT1_HOST "mkdir -p $WORK_HOME/rubbos_files" -scp $scp_options -r $WORK_HOME/rubbos_files/Servlets $TOMCAT1_HOST:$WORK_HOME/rubbos_files/Servlets -fi - diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/TOMCAT1_rubbosSL_configure.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/TOMCAT1_rubbosSL_configure.sh deleted file mode 100755 index 764ae737..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/TOMCAT1_rubbosSL_configure.sh +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -cd /bottlenecks/rubbos/rubbos_scripts/1-1-1 -source set_bottlenecks_rubbos_env.sh - -echo "CONFIGURING RUBBOS SERVLET on $HOSTNAME" - -\cp $OUTPUT_HOME/rubbos_conf/build.properties $RUBBOS_HOME/ - -\cp -r $WORK_HOME/rubbos_files/Servlets $RUBBOS_HOME/ -\cp $OUTPUT_HOME/rubbos_conf/mysql.properties $RUBBOS_HOME/Servlets/ -\cp $OUTPUT_HOME/rubbos_conf/build.xml $RUBBOS_HOME/Servlets/ -\cp $OUTPUT_HOME/rubbos_conf/Config.java $RUBBOS_HOME/Servlets/edu/rice/rubbos/servlets/ -\cp $OUTPUT_HOME/rubbos_conf/web.xml $RUBBOS_HOME/Servlet_HTML/WEB-INF/ - -cd $RUBBOS_HOME/Servlets/edu/rice/rubbos/servlets -sed 's/public static final int BrowseCategoriesPoolSize = 6;/public static final int BrowseCategoriesPoolSize = 12;/g' Config.java > Config.java.tmp -mv Config.java.tmp Config.java - -cd $RUBBOS_HOME/Servlets -/bottlenecks/rubbos/app/apache-ant-1.6.5/bin/ant clean >/dev/null -/bottlenecks/rubbos/app/apache-ant-1.6.5/bin/ant dist >/dev/null -make >/dev/null 2>&1 -cp rubbos.war $CATALINA_HOME/webapps/ - -echo "DONE CONFIGURING RUBBOS SERVLET on $HOSTNAME" diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/TOMCAT1_rubbos_install.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/TOMCAT1_rubbos_install.sh deleted file mode 100755 index e370cffa..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/TOMCAT1_rubbos_install.sh +++ /dev/null @@ -1,37 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -cd /bottlenecks/rubbos/rubbos_scripts/1-1-1 -source set_bottlenecks_rubbos_env.sh - -echo "INSTALLING RUBBOS/SYSSTAT on $HOSTNAME" - -mkdir -p $RUBBOS_APP -# install RUBBoS -tar xzf $SOFTWARE_HOME/$RUBBOS_TARBALL --directory=$RUBBOS_APP -mkdir -p $RUBBOS_HOME/bench -cp $SOFTWARE_HOME/flush_cache $RUBBOS_HOME/bench/. - -mkdir -p $SYSSTAT_HOME -# install sysstat -tar xzf $SOFTWARE_HOME/$SYSSTAT_TARBALL --directory=$RUBBOS_APP - -cd $SYSSTAT_HOME -./configure --prefix=$SYSSTAT_HOME >/dev/null -make >/dev/null 2>&1 -sudo make install >/dev/null - -# install a script to collect statistics data -cp $OUTPUT_HOME/rubbos_conf/cpu_mem.sh $RUBBOS_APP/. -chmod 755 $RUBBOS_APP/cpu_mem.sh - -echo "DONE INSTALLING RUBBOS/SYSSTAT on $HOSTNAME" - - diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/TOMCAT1_rubbos_uninstall.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/TOMCAT1_rubbos_uninstall.sh deleted file mode 100755 index 75eb561c..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/TOMCAT1_rubbos_uninstall.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -cd /bottlenecks/rubbos/rubbos_scripts/1-1-1 -source set_bottlenecks_rubbos_env.sh - -cd $SYSSTAT_HOME -sudo make uninstall -sudo rm -rf $SYSSTAT_HOME -rm -rf $RUBBOS_HOME - - diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/TOMCAT1_stop.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/TOMCAT1_stop.sh deleted file mode 100755 index 9e17d7c9..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/TOMCAT1_stop.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -cd /bottlenecks/rubbos/rubbos_scripts/1-1-1 -source set_bottlenecks_rubbos_env.sh - -echo "STOPPING TOMCAT on $HOSTNAME" - -cd $CATALINA_HOME/bin -./shutdown.sh - -echo "TOMCAT IS STOPPED on $HOSTNAME" - - diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/TOMCAT1_uninstall.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/TOMCAT1_uninstall.sh deleted file mode 100755 index 06bffaef..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/TOMCAT1_uninstall.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -cd /bottlenecks/rubbos/rubbos_scripts/1-1-1 -source set_bottlenecks_rubbos_env.sh - -rm -rf $CATALINA_HOME - - diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/check_service_status.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/check_service_status.sh deleted file mode 100755 index 8434be82..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/check_service_status.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -cd /bottlenecks/rubbos/rubbos_scripts/1-1-1 -source set_bottlenecks_rubbos_env.sh - -#ssh_options="" - -ssh root@$TOMCAT1_HOST service tomcat status -ssh root@$HTTPD_HOST service apache2 status -ssh root@$MYSQL1_HOST service mysql status - diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/env_preparation.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/env_preparation.sh deleted file mode 100755 index 6ecf4832..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/env_preparation.sh +++ /dev/null @@ -1,50 +0,0 @@ -#!/bin/bash -############################################################################### -# Copyright (c) 2015 Huawei Tech. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -set -ex - -RELENG_REPO=https://gerrit.opnfv.org/gerrit/releng -RELENG_REPO_DIR=/tmp/opnfvrepo/releng -#RELENG_BRANCH=master # branch, tag, sha1 or refspec - -INSTALLER_TYPE=fuel -INSTALLER_IP=10.20.0.2 - -NODE_NAME=opnfv-jump-2 -EXTERNAL_NET=net04_ext - -echo "INFO: Creating openstack credentials .." - -if [ -d $RELENG_REPO_DIR ]; then - rm -rf ${RELENG_REPO_DIR} -fi -mkdir -p ${RELENG_REPO_DIR} -git config --global http.sslVerify false -git clone ${RELENG_REPO} ${RELENG_REPO_DIR} - -# Create openstack credentials -$RELENG_REPO_DIR/utils/fetch_os_creds.sh \ - -d /tmp/openrc \ - -i ${INSTALLER_TYPE} -a ${INSTALLER_IP} - -source /tmp/openrc - -# FIXME: Temporary OPNFV playground hack -if [ "$INSTALLER_TYPE" == "fuel" ]; then - ssh_opts="-o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" - if sshpass -p r00tme ssh 2>/dev/null $ssh_opts root@${INSTALLER_IP} \ - fuel environment --env 1 | grep opnfv-virt; then - echo "INFO: applying OPNFV playground hack" - export OS_ENDPOINT_TYPE='publicURL' - fi -fi - -export EXTERNAL_NET INSTALLER_TYPE NODE_NAME -set +ex diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/kill_all.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/kill_all.sh deleted file mode 100755 index f91b73fd..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/kill_all.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -cd /bottlenecks/rubbos/rubbos_scripts/1-1-1 -source set_bottlenecks_rubbos_env.sh - -$OUTPUT_HOME/scripts/stop_all.sh - -for i in "$BENCHMARK_HOST" "$CLIENT1_HOST" "$CLIENT2_HOST" "$CLIENT3_HOST" "$CLIENT4_HOST" "$HTTPD_HOST" "$TOMCAT1_HOST" "$MYSQL1_HOST" -do - ssh $i " - kill -9 -1 - " -done - diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/manualCleanup.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/manualCleanup.sh deleted file mode 100755 index 94930eed..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/manualCleanup.sh +++ /dev/null @@ -1,84 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -cd /bottlenecks/rubbos/rubbos_scripts/1-1-1 -source set_bottlenecks_rubbos_env.sh - -echo "Uninstalling ...." - -ssh $BENCHMARK_HOST /tmp/BENCHMARK_uninstall.sh -ssh $CLIENT1_HOST /tmp/CLIENT1_uninstall.sh -ssh $CLIENT2_HOST /tmp/CLIENT2_uninstall.sh -ssh $CLIENT3_HOST /tmp/CLIENT3_uninstall.sh -ssh $CLIENT4_HOST /tmp/CLIENT4_uninstall.sh -ssh $HTTPD_HOST /tmp/HTTPD_uninstall.sh -ssh $TOMCAT1_HOST /tmp/TOMCAT1_uninstall.sh -ssh $MYSQL1_HOST /tmp/MYSQL1_uninstall.sh - -echo "Cleaning up ...." -for i in "$BENCHMARK_HOST" "$CLIENT1_HOST" "$CLIENT2_HOST" "$CLIENT3_HOST" "$CLIENT4_HOST" "$HTTPD_HOST" "$TOMCAT1_HOST" "$MYSQL1_HOST" -do - ssh $i " - sudo \rm -r $RUBBOS_TOP - " -done - - -ssh $CONTROL_HOST rm -f /tmp/CONTROL_checkScp_exec.sh -ssh $CONTROL_HOST rm -f /tmp/CONTROL_emulabConf_exec.sh -ssh $CONTROL_HOST rm -f /tmp/CONTROL_rubbos_exec.sh -ssh $BENCHMARK_HOST rm -f /tmp/BENCHMARK_rubbos_install.sh -ssh $BENCHMARK_HOST rm -f /tmp/BENCHMARK_install.sh -ssh $BENCHMARK_HOST rm -f /tmp/BENCHMARK_configure.sh -ssh $BENCHMARK_HOST rm -f /tmp/BENCHMARK_uninstall.sh -ssh $BENCHMARK_HOST rm -f /tmp/BENCHMARK_rubbos_uninstall.sh -ssh $CLIENT1_HOST rm -f /tmp/CLIENT1_rubbos_install.sh -ssh $CLIENT1_HOST rm -f /tmp/CLIENT1_install.sh -ssh $CLIENT1_HOST rm -f /tmp/CLIENT1_configure.sh -ssh $CLIENT1_HOST rm -f /tmp/CLIENT1_uninstall.sh -ssh $CLIENT1_HOST rm -f /tmp/CLIENT1_rubbos_uninstall.sh -ssh $CLIENT2_HOST rm -f /tmp/CLIENT2_rubbos_install.sh -ssh $CLIENT2_HOST rm -f /tmp/CLIENT2_install.sh -ssh $CLIENT2_HOST rm -f /tmp/CLIENT2_configure.sh -ssh $CLIENT2_HOST rm -f /tmp/CLIENT2_uninstall.sh -ssh $CLIENT2_HOST rm -f /tmp/CLIENT2_rubbos_uninstall.sh -ssh $CLIENT3_HOST rm -f /tmp/CLIENT3_rubbos_install.sh -ssh $CLIENT3_HOST rm -f /tmp/CLIENT3_install.sh -ssh $CLIENT3_HOST rm -f /tmp/CLIENT3_configure.sh -ssh $CLIENT3_HOST rm -f /tmp/CLIENT3_uninstall.sh -ssh $CLIENT3_HOST rm -f /tmp/CLIENT3_rubbos_uninstall.sh -ssh $CLIENT4_HOST rm -f /tmp/CLIENT4_rubbos_install.sh -ssh $CLIENT4_HOST rm -f /tmp/CLIENT4_install.sh -ssh $CLIENT4_HOST rm -f /tmp/CLIENT4_configure.sh -ssh $CLIENT4_HOST rm -f /tmp/CLIENT4_uninstall.sh -ssh $CLIENT4_HOST rm -f /tmp/CLIENT4_rubbos_uninstall.sh -ssh $HTTPD_HOST rm -f /tmp/HTTPD_install.sh -ssh $HTTPD_HOST rm -f /tmp/HTTPD_rubbos_install.sh -ssh $HTTPD_HOST rm -f /tmp/HTTPD_configure.sh -ssh $HTTPD_HOST rm -f /tmp/HTTPD_ignition.sh -ssh $HTTPD_HOST rm -f /tmp/HTTPD_stop.sh -ssh $HTTPD_HOST rm -f /tmp/HTTPD_rubbos_uninstall.sh -ssh $HTTPD_HOST rm -f /tmp/HTTPD_uninstall.sh -ssh $TOMCAT1_HOST rm -f /tmp/TOMCAT1_install.sh -ssh $TOMCAT1_HOST rm -f /tmp/TOMCAT1_rubbos_install.sh -ssh $TOMCAT1_HOST rm -f /tmp/TOMCAT1_configure.sh -ssh $TOMCAT1_HOST rm -f /tmp/TOMCAT1_rubbosSL_configure.sh -ssh $TOMCAT1_HOST rm -f /tmp/TOMCAT1_ignition.sh -ssh $TOMCAT1_HOST rm -f /tmp/TOMCAT1_stop.sh -ssh $TOMCAT1_HOST rm -f /tmp/TOMCAT1_rubbos_uninstall.sh -ssh $TOMCAT1_HOST rm -f /tmp/TOMCAT1_uninstall.sh -ssh $MYSQL1_HOST rm -f /tmp/MYSQL1_install.sh -ssh $MYSQL1_HOST rm -f /tmp/MYSQL1_rubbos_install.sh -ssh $MYSQL1_HOST rm -f /tmp/MYSQL1_configure.sh -ssh $MYSQL1_HOST rm -f /tmp/MYSQL1_reset.sh -ssh $MYSQL1_HOST rm -f /tmp/MYSQL1_ignition.sh -ssh $MYSQL1_HOST rm -f /tmp/MYSQL1_stop.sh -ssh $MYSQL1_HOST rm -f /tmp/MYSQL1_rubbos_uninstall.sh -ssh $MYSQL1_HOST rm -f /tmp/MYSQL1_uninstall.sh diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/reset_all.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/reset_all.sh deleted file mode 100755 index eeeab8b9..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/reset_all.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -cd /bottlenecks/rubbos/rubbos_scripts/1-1-1 -source set_bottlenecks_rubbos_env.sh - -ssh $MYSQL1_HOST /tmp/MYSQL1_reset.sh & -sleep 120 - diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/run.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/run.sh deleted file mode 100755 index 47cec3ad..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/run.sh +++ /dev/null @@ -1,153 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -set -x - -cd /bottlenecks/rubbos/rubbos_scripts/1-1-1 -source set_bottlenecks_rubbos_env.sh -cd /bottlenecks/rubbos/rubbos_scripts/1-1-1/scripts -# Transfer all sub scripts to target hosts -echo "*** scp scripts *************************************************" - -scp_options="-o StrictHostKeyChecking=no -o BatchMode=yes" - -scp $scp_options CONTROL_rubbos_exec.sh $CONTROL_HOST:/tmp - -if true; then -for script in BENCHMARK_rubbos_install.sh BENCHMARK_install.sh \ - BENCHMARK_configure.sh BENCHMARK_uninstall.sh \ - BENCHMARK_rubbos_uninstall.sh -do - scp $scp_options $script $BENCHMARK_HOST:/tmp -done -fi - -if true; then -for i in {1..4} -do - for script in CLIENT${i}_rubbos_install.sh CLIENT${i}_install.sh \ - CLIENT${i}_configure.sh CLIENT${i}_uninstall.sh \ - CLIENT${i}_rubbos_uninstall.sh - do - CLIENT_HOST=`printenv CLIENT${i}_HOST` - scp $scp_options $script $CLIENT_HOST:/tmp - done -done -fi - -if true; then -for script in HTTPD_install.sh HTTPD_rubbos_install.sh \ - HTTPD_configure.sh HTTPD_ignition.sh \ - HTTPD_stop.sh HTTPD_rubbos_uninstall.sh \ - HTTPD_uninstall.sh -do - scp $scp_options $script $HTTPD_HOST:/tmp -done -fi - -if true; then -for script in TOMCAT1_install.sh TOMCAT1_rubbos_install.sh \ - TOMCAT1_configure.sh TOMCAT1_rubbosSL_configure.sh \ - TOMCAT1_ignition.sh TOMCAT1_stop.sh \ - TOMCAT1_rubbos_uninstall.sh TOMCAT1_uninstall.sh -do - scp $scp_options $script $TOMCAT1_HOST:/tmp -done -fi - -if true; then -for script in MYSQL1_install.sh MYSQL1_rubbos_install.sh \ - MYSQL1_configure.sh MYSQL1_reset.sh \ - MYSQL1_ignition.sh MYSQL1_stop.sh \ - MYSQL1_rubbos_uninstall.sh \ - MYSQL1_uninstall.sh -do - scp $scp_options $script $MYSQL1_HOST:/tmp -done -fi - -# Prepare software packages -echo "*** prepare software packages ***" -./MYSQL1_pkg_prepare.sh -./TOMCAT1_pkg_prepare.sh -./HTTPD_pkg_prepare.sh -./BENCHMARK_pkg_prepare.sh -for i in {1..4} -do - ./CLIENT${i}_pkg_prepare.sh -done - -# Install and Configure and run Apache, Tomcat, CJDBC, and MySQL -echo "*** install scripts & configure & execute ***********************" - -ssh root@$MYSQL1_HOST chmod 770 /tmp/MYSQL1_install.sh -ssh $MYSQL1_HOST /tmp/MYSQL1_install.sh - -ssh root@$TOMCAT1_HOST chmod 770 /tmp/TOMCAT1_install.sh -ssh $TOMCAT1_HOST /tmp/TOMCAT1_install.sh - -ssh root@$HTTPD_HOST chmod 770 /tmp/HTTPD_install.sh -ssh $HTTPD_HOST /tmp/HTTPD_install.sh - -ssh root@$MYSQL1_HOST chmod 770 /tmp/MYSQL1_rubbos_install.sh -ssh $MYSQL1_HOST /tmp/MYSQL1_rubbos_install.sh - -ssh root@$TOMCAT1_HOST chmod 770 /tmp/TOMCAT1_rubbos_install.sh -ssh $TOMCAT1_HOST /tmp/TOMCAT1_rubbos_install.sh - -ssh root@$HTTPD_HOST chmod 770 /tmp/HTTPD_rubbos_install.sh -ssh $HTTPD_HOST /tmp/HTTPD_rubbos_install.sh - -ssh root@$BENCHMARK_HOST chmod 770 /tmp/BENCHMARK_rubbos_install.sh -ssh $BENCHMARK_HOST /tmp/BENCHMARK_rubbos_install.sh - -for i in {1..4} -do - CLIENT_HOST=`printenv CLIENT${i}_HOST` - ssh root@$CLIENT_HOST chmod 770 /tmp/CLIENT${i}_rubbos_install.sh - ssh $CLIENT_HOST /tmp/CLIENT${i}_rubbos_install.sh -done - -ssh root@$BENCHMARK_HOST chmod 770 /tmp/BENCHMARK_install.sh -ssh $BENCHMARK_HOST /tmp/BENCHMARK_install.sh - -for i in {1..4} -do - CLIENT_HOST=`printenv CLIENT${i}_HOST` - ssh root@$CLIENT_HOST chmod 770 /tmp/CLIENT${i}_install.sh - ssh $CLIENT_HOST /tmp/CLIENT${i}_install.sh -done - -ssh root@$MYSQL1_HOST chmod 770 /tmp/MYSQL1_configure.sh -ssh $MYSQL1_HOST /tmp/MYSQL1_configure.sh & -sleep 60 - -ssh root@$TOMCAT1_HOST chmod 770 /tmp/TOMCAT1_configure.sh -ssh $TOMCAT1_HOST /tmp/TOMCAT1_configure.sh - -ssh root@$HTTPD_HOST chmod 770 /tmp/HTTPD_configure.sh -ssh $HTTPD_HOST /tmp/HTTPD_configure.sh - -ssh root@$BENCHMARK_HOST chmod 770 /tmp/BENCHMARK_configure.sh -ssh $BENCHMARK_HOST /tmp/BENCHMARK_configure.sh - -for i in {1..4} -do - CLIENT_HOST=`printenv CLIENT${i}_HOST` - ssh root@$CLIENT_HOST chmod 770 /tmp/CLIENT${i}_configure.sh - ssh $CLIENT_HOST /tmp/CLIENT${i}_configure.sh -done - -ssh root@$TOMCAT1_HOST chmod 770 /tmp/TOMCAT1_rubbosSL_configure.sh -ssh $TOMCAT1_HOST /tmp/TOMCAT1_rubbosSL_configure.sh - -ssh $CONTROL_HOST /tmp/CONTROL_rubbos_exec.sh - -set +x diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/start_all.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/start_all.sh deleted file mode 100755 index e47b54d3..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/start_all.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -cd /bottlenecks/rubbos/rubbos_scripts/1-1-1 -source set_bottlenecks_rubbos_env.sh - -ssh $MYSQL1_HOST /tmp/MYSQL1_ignition.sh & -sleep 20 - -ssh $TOMCAT1_HOST /tmp/TOMCAT1_ignition.sh -sleep 10 - -ssh $HTTPD_HOST /tmp/HTTPD_ignition.sh -sleep 5 diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/stop_all.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/stop_all.sh deleted file mode 100755 index 8e57b2b2..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/scripts/stop_all.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -cd /bottlenecks/rubbos/rubbos_scripts/1-1-1 -source set_bottlenecks_rubbos_env.sh - -ssh $HTTPD_HOST /tmp/HTTPD_stop.sh - -ssh $TOMCAT1_HOST /tmp/TOMCAT1_stop.sh - -ssh $MYSQL1_HOST /tmp/MYSQL1_stop.sh diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/set_bottlenecks_rubbos_env.sh b/testsuites/rubbos/rubbos_scripts/1-1-1/set_bottlenecks_rubbos_env.sh deleted file mode 100755 index 0d175eba..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/set_bottlenecks_rubbos_env.sh +++ /dev/null @@ -1,95 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -set -o allexport - -# HOSTS -CONTROL_HOST=REPLACE_CONTROL_HOST -HTTPD_HOST=REPLACE_HTTPD_HOST -MYSQL1_HOST=REPLACE_MYSQL1_HOST -TOMCAT1_HOST=REPLACE_TOMCAT1_HOST -CLIENT1_HOST=REPLACE_CLIENT1_HOST -CLIENT2_HOST=REPLACE_CLIENT2_HOST -CLIENT3_HOST=REPLACE_CLIENT3_HOST -CLIENT4_HOST=REPLACE_CLIENT4_HOST -BENCHMARK_HOST=REPLACE_BENCHMARK_HOST - -# Experiment name on OPNFV -BOTTLNECKS_NAME=bottlenecks - -# Directories from which files are copied -WORK_HOME=/bottlenecks/rubbos/rubbos_scripts/rubbosMulini6 -OUTPUT_HOME=/bottlenecks/rubbos/rubbos_scripts/1-1-1 -SOFTWARE_HOME=/bottlenecks/rubbos/app_tools - -# Output directory for results of RUBBoS benchmark -RUBBOS_RESULTS_HOST=${CONTROL_HOST} -RUBBOS_RESULTS_DIR_BASE=/bottlenecks/rubbos/rubbos_results -RUBBOS_RESULTS_DIR_NAME=2015-01-20T081237-0700 - -# Target directories -BOTTLENECKS_TOP=/bottlenecks -RUBBOS_TOP=$BOTTLENECKS_TOP/rubbos -RUBBOS_APP=$RUBBOS_TOP/app -TMP_RESULTS_DIR_BASE=$RUBBOS_TOP/tmp_results -RUBBOS_HOME=$RUBBOS_APP/RUBBoS -SYSSTAT_HOME=$RUBBOS_APP/sysstat-9.0.6 - -HTTPD_HOME=$RUBBOS_APP/apache2 -HTTPD_INSTALL_FILES=$RUBBOS_APP/httpd-2.0.64 -MOD_JK_INSTALL_FILES=$RUBBOS_APP/tomcat-connectors-1.2.32-src -MOD_JK_INSTALL_CONFIGURE=$MOD_JK_INSTALL_FILES/native -CATALINA_HOME=$RUBBOS_APP/apache-tomcat-5.5.17 -SERVLET_API_PATH=$CATALINA_HOME/common/lib/servlet-api.jar -CATALINA_BASE=$CATALINA_HOME -CJDBC_HOME= - -MYSQL_HOME=$RUBBOS_APP/mysql-5.5.46-linux2.6-x86_64 - -# Java & Ant -JAVA_HOME=$RUBBOS_APP/jdk1.6.0_27 -JAVA_OPTS="-Xmx1300m" -J2EE_HOME=$RUBBOS_APP/j2sdkee1.3.1 -ANT_HOME=$RUBBOS_APP/apache-ant-1.6.5 - -# Tarballs -JAVA_TARBALL=jdk1.6.0_27.tar.gz -J2EE_TARBALL=j2sdkee1.3.1.jar.gz -ANT_TARBALL=apache-ant-1.6.5.tar.gz -SYSSTAT_TARBALL=sysstat-9.0.6.tar.gz -HTTPD_TARBALL=httpd-2.0.64.tar.gz -MOD_JK_TARBALL=tomcat-connectors-1.2.32-src.tar.gz -TOMCAT_TARBALL=apache-tomcat-5.5.17.tar.gz -CJDBC_TARBALL= -MYSQL_TARBALL=mysql-5.5.46-linux2.6-x86_64.tar.gz -RUBBOS_TARBALL=RUBBoS-servlets.tar.gz -RUBBOS_DATA_TARBALL=rubbos_data.sql.tar.gz -RUBBOS_DATA_SQL=rubbos_data.sql -RUBBOS_DATA_TEXTFILES_TARBALL=smallDB-rubbos-modified.tgz - -# for MySQL -MYSQL_CONNECTOR=mysql-connector-java-5.1.7-bin.jar -MYSQL_PORT=3313 -MYSQL_SOCKET=$MYSQL_HOME/mysql.sock -MYSQL_DATA_DIR=$MYSQL_HOME/data -MYSQL_ERR_LOG=$MYSQL_HOME/data/mysql.log -MYSQL_PID_FILE=$MYSQL_HOME/run/mysqld.pid - -# for DBs & C-JDBC -ROOT_PASSWORD=new-password -BOTTLENECKS_USER=mysql -BOTTLENECKS_PASSWORD=mysql - - -CLASSPATH=$CLASSPATH:$JONAS_ROOT/bin/unix/registry:$JAVA_HOME:$JAVA_HOME/lib/tools.jar:$SERVLET_API_PATH:. - -PATH=$JAVA_HOME/bin:$JONAS_ROOT/bin/unix:$ANT_HOME/bin:$CATALINA_HOME/bin:$PATH -set +o allexport - diff --git a/testsuites/rubbos/rubbos_scripts/1-1-1/sysstat_conf/CONFIG b/testsuites/rubbos/rubbos_scripts/1-1-1/sysstat_conf/CONFIG deleted file mode 100644 index 24bfca3a..00000000 --- a/testsuites/rubbos/rubbos_scripts/1-1-1/sysstat_conf/CONFIG +++ /dev/null @@ -1,46 +0,0 @@ - -# Configuration file for sysstat -# (C) 2000-2006 Sebastien GODARD (sysstat wanadoo.fr) - -# Directories -PREFIX = /bottlenecks/rubbos/app/sysstat-9.0.6 -SA_LIB_DIR = /bottlenecks/rubbos/app/sysstat-9.0.6/lib/sa -SADC_PATH = ${SA_LIB_DIR}/sadc -SA_DIR = /bottlenecks/rubbos/app/sysstat-9.0.6/var/log/sa -MAN_DIR = /bottlenecks/rubbos/app/sysstat-9.0.6/man -CLEAN_SA_DIR = n -YESTERDAY = -HISTORY = 7 - -DFLAGS = -SAS_DFLAGS = - -ENABLE_NLS = y -ENABLE_SMP_WRKARD = n - -ifeq ($(ENABLE_NLS),y) -# NLS (National Language Support) -REQUIRE_NLS = -DUSE_NLS -DPACKAGE=\"$(PACKAGE)\" -DLOCALEDIR=\"$(PREFIX)/share/locale\" -endif -ifdef REQUIRE_NLS - DFLAGS += $(REQUIRE_NLS) -endif - -ifeq ($(ENABLE_SMP_WRKARD),y) -# Uncomment this to enable workaround for Linux kernel SMP race condition -SAS_DFLAGS += -DSMP_RACE -endif - -# Man page group -MAN_GROUP = man - -# Crontab owner -CRON_OWNER = adm - -# Run-command directories -RC_DIR = /etc -INIT_DIR = /etc/init.d -INITD_DIR = init.d - -INSTALL_CRON = n - diff --git a/testsuites/rubbos/run_rubbos.py b/testsuites/rubbos/run_rubbos.py deleted file mode 100755 index f0fb089a..00000000 --- a/testsuites/rubbos/run_rubbos.py +++ /dev/null @@ -1,478 +0,0 @@ -#!/usr/bin/env python -############################################################################## -# Copyright (c) 2016 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -import os -import argparse -import time -import subprocess -import logging -import urllib2 -import shutil -from heatclient.client import Client as HeatClient -from keystoneclient.v2_0.client import Client as KeystoneClient -from glanceclient.v2.client import Client as GlanceClient -from novaclient.client import Client as NovaClient - -#------------------------------------------------------ -# parser for configuration files in each test case -# ------------------------------------------------------ -parser = argparse.ArgumentParser() -parser.add_argument( - "-c", - "--conf", - help="configuration files for the testcase, in yaml format", - default="/home/opnfv/bottlenecks/testsuites/rubbos/testcase_cfg/rubbos_basic.yaml") -args = parser.parse_args() - -#-------------------------------------------------- -# logging configuration -#-------------------------------------------------- -logger = logging.getLogger(__name__) - - -def _get_keystone_client(): - keystone_client = KeystoneClient( - auth_url=os.environ.get('OS_AUTH_URL'), - username=os.environ.get('OS_USERNAME'), - password=os.environ.get('OS_PASSWORD'), - tenant_name=os.environ.get('OS_TENANT_NAME'), - cacert=os.environ.get('OS_CACERT')) - return keystone_client - - -def _get_heat_client(): - keystone = _get_keystone_client() - heat_endpoint = keystone.service_catalog.url_for( - service_type='orchestration') - heat_client = HeatClient( - '1', - endpoint=heat_endpoint, - token=keystone.auth_token) - return heat_client - - -def _get_glance_client(): - keystone = _get_keystone_client() - glance_endpoint = keystone.service_catalog.url_for( - service_type='image', endpoint_type='publicURL') - return GlanceClient(glance_endpoint, token=keystone.auth_token) - - -def _get_nova_client(): - nova_client = NovaClient("2", os.environ.get('OS_USERNAME'), - os.environ.get('OS_PASSWORD'), - os.environ.get('OS_TENANT_NAME'), - os.environ.get('OS_AUTH_URL')) - return nova_client - - -def _download_url(src_url, dest_dir): - ''' Download a file to a destination path given a URL''' - file_name = src_url.rsplit('/')[-1] - dest = dest_dir + "/" + file_name - try: - response = urllib2.urlopen(src_url) - except (urllib2.HTTPError, urllib2.URLError): - return None - - with open(dest, 'wb') as f: - shutil.copyfileobj(response, f) - return dest - - -def rubbos_stack_satisfy( - name="bottlenecks_rubbos_stack", - status="CREATE_COMPLETE"): - heat = _get_heat_client() - for stack in heat.stacks.list(): - if status is None and stack.stack_name == name: - # Found target stack - print "Found stack, name=" + str(stack.stack_name) - return True - elif stack.stack_name == name and stack.stack_status == status: - print "Found stack, name=" + str(stack.stack_name) + ", status=" + str(stack.stack_status) - return True - return False - - -def rubbos_env_prepare(template=None): - print "========== Prepare rubbos environment ==========" - logger.info( - "Generate heat template for the testcase based on template '%s'." % - template) - - -def rubbos_env_cleanup(): - print "========== Cleanup rubbos environment ==========" - glance = _get_glance_client() - heat = _get_heat_client() - nova = _get_nova_client() - - for image in glance.images.list(): - if image.name.find("bottlenecks_rubbos") >= 0: - print "Delete image, id:" + str(image.id) + ", name:" + str(image.name) - glance.images.delete(image.id) - - for keypair in nova.keypairs.list(): - if keypair.name.find("bottlenecks_rubbos") >= 0: - print "Delete keypair, id:" + str(keypair.id) + ", name:" + str(keypair.name) - nova.keypairs.delete(keypair.id) - - for flavor in nova.flavors.list(): - if flavor.name.find("bottlenecks_rubbos") >= 0: - print "Delete flavor, id:" + str(flavor.id) + ", name:" + str(flavor.name) - nova.flavors.delete(flavor.id) - - for stack in heat.stacks.list(): - if stack.stack_name.find("bottlenecks_rubbos") >= 0: - print "Delete stack, id: " + str(stack.id) + ", name:" + str(stack.stack_name) - heat.stacks.delete(stack.id) - - timeInProgress = 0 - while rubbos_stack_satisfy( - name="bottlenecks_rubbos_stack", - status=None) and timeInProgress < 60: - time.sleep(5) - timeInProgress = timeInProgress + 5 - - if rubbos_stack_satisfy(name="bottlenecks_rubbos_stack", status=None): - print "Failed to clean the stack" - return False - else: - return True - - -def rubbos_create_images( - imagefile=None, - image_name="bottlenecks_rubbos_image"): - print "========== Create rubbos image in OS ==========" - - if imagefile is None: - print "imagefile not set/found" - return False - - glance = _get_glance_client() - image = glance.images.create( - name=image_name, - disk_format="qcow2", - container_format="bare") - with open(imagefile) as fimage: - glance.images.upload(image.id, fimage) - - timeInQueue = 0 - img_status = image.status - while img_status == "queued" and timeInQueue < 30: - print " image's status: " + img_status - time.sleep(1) - timeInQueue = timeInQueue + 1 - img_status = glance.images.get(image.id).status - - print "After %d seconds, the image's status is [%s]" % (timeInQueue, img_status) - return True if img_status == "active" else False - - -def rubbos_create_keypairs(key_path, name="bottlenecks_rubbos_keypair"): - print "========== Add rubbos keypairs in OS ==========" - nova = _get_nova_client() - with open(key_path) as pkey: - nova.keypairs.create(name=name, public_key=pkey.read()) - - -def rubbos_create_flavors( - name="bottlenecks_rubbos_flavor", - ram=4096, - vcpus=2, - disk=10): - print "========== Create rubbos flavors in OS ==========" - nova = _get_nova_client() - nova.flavors.create(name=name, ram=ram, vcpus=vcpus, disk=disk) - - -def rubbos_create_instances( - template_file, - rubbos_parameters=None, - stack_name="bottlenecks_rubbos_stack"): - print "========== Create rubbos instances ==========" - heat = _get_heat_client() - - with open(template_file) as template: - stack = heat.stacks.create( - stack_name=stack_name, - template=template.read(), - parameters=rubbos_parameters) - - stack_id = stack['stack']['id'] - stack_status = heat.stacks.get(stack_id).stack_status - - print "Created stack, id=" + str(stack_id) + ", status=" + str(stack_status) - - timeInProgress = 0 - while stack_status == "CREATE_IN_PROGRESS" and timeInProgress < 3600: - print " stack's status: %s, after %d seconds" % (stack_status, timeInProgress) - time.sleep(5) - timeInProgress = timeInProgress + 5 - stack_status = heat.stacks.get(stack_id).stack_status - - print "After %d seconds, the stack's status is [%s]" % (timeInProgress, stack_status) - return True if stack_status == "CREATE_COMPLETE" else False - - -def get_instances(nova_client): - try: - instances = nova_client.servers.list(search_opts={'all_tenants': 1}) - return instances - except Exception as e: - print "Error [get_instances(nova_client)]:", e - return None - - -def reboot_instances(): - print("========== reboot instances ==========") - nova = _get_nova_client() - print("nova servers list:") - print(nova.servers.list()) - for instance in nova.servers.list(): - name = getattr(instance, 'name') - if name.find("rubbos") >= 0: - print("reboot %s" % name) - instance.reboot() - print("Finish reboot all rubbos servers.") - - -def rubbos_run(): - print "========== run rubbos ===========" - - nova = _get_nova_client() - instances = get_instances(nova) - if instances is None: - print "Found *None* instances, exit rubbos_run()!" - return False - - control_public_ip = "" - control_server = "" - client_servers = "" - web_servers = "" - app_servers = "" - cjdbc_controller = "" - database_servers = "" - for instance in instances: - name = getattr(instance, 'name') - private_ip = [ - x['addr'] for x in getattr( - instance, - 'addresses').itervalues().next() if x['OS-EXT-IPS:type'] == 'fixed'] - public_ip = [ - x['addr'] for x in getattr( - instance, - 'addresses').itervalues().next() if x['OS-EXT-IPS:type'] == 'floating'] - - if name.find("rubbos-control") >= 0: - control_public_ip = public_ip[0] - control_server = str(name) + ':' + \ - public_ip[0] + ':' + private_ip[0] - if name.find("rubbos-client") >= 0: - client_servers = client_servers + \ - str(name) + ':' + private_ip[0] + "," - if name.find("rubbos-httpd") >= 0: - web_servers = web_servers + str(name) + ':' + private_ip[0] + "," - if name.find("rubbos-tomcat") >= 0: - app_servers = app_servers + str(name) + ':' + private_ip[0] + "," - if name.find("rubbos-cjdbc") >= 0: - cjdbc_controller = str(name) + ':' + private_ip[0] - if name.find("rubbos-mysql") >= 0: - database_servers = database_servers + \ - str(name) + ':' + private_ip[0] + "," - - client_servers = client_servers[0:len(client_servers) - 1] - web_servers = web_servers[0:len(web_servers) - 1] - app_servers = app_servers[0:len(app_servers) - 1] - database_servers = database_servers[0:len(database_servers) - 1] - print "control_server: %s" % control_server - print "client_servers: %s" % client_servers - print "web_servers: %s" % web_servers - print "app_servers: %s" % app_servers - print "cjdbc_controller: %s" % cjdbc_controller - print "database_servers: %s" % database_servers - with open(Bottlenecks_repo_dir + "/testsuites/rubbos/puppet_manifests/internal/rubbos.conf") as temp_f, open('rubbos.conf', 'w') as new_f: - for line in temp_f.readlines(): - if line.find("REPLACED_CONTROLLER") >= 0: - new_f.write( - line.replace( - "REPLACED_CONTROLLER", - control_server)) - elif line.find("REPLACED_CLIENT_SERVERS") >= 0: - new_f.write( - line.replace( - "REPLACED_CLIENT_SERVERS", - client_servers)) - elif line.find("REPLACED_WEB_SERVERS") >= 0: - new_f.write(line.replace("REPLACED_WEB_SERVERS", web_servers)) - elif line.find("REPLACED_APP_SERVERS") >= 0: - new_f.write(line.replace("REPLACED_APP_SERVERS", app_servers)) - elif line.find("REPLACED_CJDBC_CONTROLLER") >= 0: - new_f.write( - line.replace( - "REPLACED_CJDBC_CONTROLLER", - cjdbc_controller)) - elif line.find("REPLACED_DB_SERVERS") >= 0: - new_f.write( - line.replace( - "REPLACED_DB_SERVERS", - database_servers)) - elif line.find("REPLACED_CLIENTS_PER_NODE") >= 0: - new_f.write( - line.replace( - "REPLACED_CLIENTS_PER_NODE", - "200 400 800 1600 3200")) - else: - new_f.write(line) - if os.path.exists("rubbos.conf") == False: - return False - - cmd = "sudo chmod 0600 " + Bottlenecks_repo_dir + \ - "/utils/infra_setup/bottlenecks_key/bottlenecks_key" - subprocess.call(cmd, shell=True) - ssh_args = "-o StrictHostKeyChecking=no -o BatchMode=yes -i " + \ - Bottlenecks_repo_dir + "/utils/infra_setup/bottlenecks_key/bottlenecks_key " - - print "############### Test #################" - cmd = 'ssh-keygen -f "/root/.ssh/known_hosts" -R ' + control_public_ip - subprocess.call(cmd, shell=True) - print "## Ping test:" - cmd = "ping -c 5 " + control_public_ip - print cmd - subprocess.call(cmd, shell=True) - print "## ssh date test:" - cmd = "ssh " + ssh_args + " ubuntu@" + control_public_ip + ' "date"' - print cmd - subprocess.call(cmd, shell=True) - print "## neutruon net-list:" - subprocess.call("neutron net-list", shell=True) - print "## nova list:" - subprocess.call("nova list", shell=True) - print "############### Test #################" - - cmd = "scp " + ssh_args + "rubbos.conf ubuntu@" + \ - control_public_ip + ":/home/ubuntu/" - print "Exec shell: " + cmd - subprocess.call(cmd, shell=True) - - cmd = "scp " + ssh_args + Bottlenecks_repo_dir + \ - "/testsuites/rubbos/puppet_manifests/internal/run_rubbos_internal.sh ubuntu@" + control_public_ip + ":/home/ubuntu/" - print "Exec shell: " + cmd - subprocess.call(cmd, shell=True) - - cmd = "scp " + ssh_args + Bottlenecks_repo_dir + \ - "/utils/infra_setup/bottlenecks_key/bottlenecks_key ubuntu@" + control_public_ip + ":/home/ubuntu/" - print "Exec shell: " + cmd - subprocess.call(cmd, shell=True) - - # call remote run_rubbos_internal.sh - cmd = "ssh " + ssh_args + " ubuntu@" + control_public_ip + \ - ' "sudo /home/ubuntu/run_rubbos_internal.sh /home/ubuntu/rubbos.conf /home/ubuntu/btnks-results" ' - print "Exec shell: " + cmd - subprocess.call(cmd, shell=True) - cmd = "scp " + ssh_args + " ubuntu@" + control_public_ip + \ - ":/home/ubuntu/btnks-results/rubbos.out ./rubbos.out" - print "Exec shell: " + cmd - subprocess.call(cmd, shell=True) - if os.path.exists("rubbos.out") == False: - print "Failed to fetch results from the rubbos_control node!" - return False - - with open("rubbos.out") as f: - lines = f.readlines() - print "Rubbos results:" - for line in lines: - print line - return True - - -def main(): - global Heat_template - global Bottlenecks_repo_dir - global image_url - # same in Dockerfile, docker directory - Bottlenecks_repo_dir = "/home/opnfv/bottlenecks" - - image_url = 'http://artifacts.opnfv.org/bottlenecks/rubbos/trusty-server-cloudimg-amd64-btnks.img' - #image_url = 'http://artifacts.opnfv.org/bottlenecks/rubbos/bottlenecks-trusty-server.img' - - if not (args.conf): - logger.error("Configuration files are not set for testcase") - exit(-1) - else: - Heat_template = args.conf - - master_user_data = "" - agent_user_data = "" - with open(Bottlenecks_repo_dir + "/utils/infra_setup/user_data/p-master-user-data") as f: - master_user_data = f.read() - master_user_data = master_user_data.replace( - 'REPLACED_PUPPET_MASTER_SERVER', 'rubbos-control') - with open(Bottlenecks_repo_dir + "/utils/infra_setup/user_data/p-agent-user-data") as f: - agent_user_data = f.read() - agent_user_data = agent_user_data.replace( - 'REPLACED_PUPPET_MASTER_SERVER', 'rubbos-control') - - parameters = {'image': 'bottlenecks_rubbos_image', - 'key_name': 'bottlenecks_rubbos_keypair', - 'flavor': 'bottlenecks_rubbos_flavor', - 'public_net': os.environ.get('EXTERNAL_NET'), - 'master_user_data': master_user_data, - 'agent_user_data': agent_user_data} - - print "Heat_template_file: " + Heat_template - print "parameters:\n" + str(parameters) - - image_created = False - stack_created = False - - rubbos_env_prepare(Heat_template) - rubbos_env_cleanup() - - dest_dir = "/tmp" - image_file = _download_url(image_url, dest_dir) - if image_file is None: - print "error with downloading image(s)" - exit(-1) - - image_created = rubbos_create_images(imagefile=image_file) - keyPath = Bottlenecks_repo_dir + \ - "/utils/infra_setup/bottlenecks_key/bottlenecks_key.pub" - rubbos_create_keypairs(key_path=keyPath) - rubbos_create_flavors() - - if image_created: - stack_created = rubbos_create_instances( - template_file=Heat_template, - rubbos_parameters=parameters, - stack_name="bottlenecks_rubbos_stack") - else: - print "Cannot create instances, as Failed to create image(s)." - exit(-1) - - if stack_created: - print "The rubbos_stack is created successfully. \ - Now to run rubbos instances!" - else: - print "The rubbos_stack failed to be created. Exit the test!" - exit(-1) - - # reboot_instances() - # time.sleep(180) - - rubbos_run() - time.sleep(30) - - rubbos_env_cleanup() - -if __name__ == '__main__': - main() diff --git a/testsuites/rubbos/testsuite_story/rubbos_story1 b/testsuites/rubbos/testsuite_story/rubbos_story1 deleted file mode 100755 index af143e30..00000000 --- a/testsuites/rubbos/testsuite_story/rubbos_story1 +++ /dev/null @@ -1 +0,0 @@ -rubbos_1-1-0-1 diff --git a/testsuites/rubbos/testsuite_story/rubbos_story2 b/testsuites/rubbos/testsuite_story/rubbos_story2 deleted file mode 100755 index b35fbdd7..00000000 --- a/testsuites/rubbos/testsuite_story/rubbos_story2 +++ /dev/null @@ -1,2 +0,0 @@ -rubbos_1-1-0-1 -rubbos_1-2-0-1 diff --git a/testsuites/vstf/run_vstf.py b/testsuites/vstf/run_vstf.py deleted file mode 100755 index f0018e7a..00000000 --- a/testsuites/vstf/run_vstf.py +++ /dev/null @@ -1,333 +0,0 @@ -#!/usr/bin/env python -############################################################################## -# Copyright (c) 2016 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -import os -import argparse -import time -import subprocess -import logging -import urllib2 -import shutil -from heatclient.client import Client as HeatClient -from keystoneclient.v2_0.client import Client as KeystoneClient -from glanceclient.v2.client import Client as GlanceClient -from novaclient.client import Client as NovaClient - -#------------------------------------------------------ -# parser for configuration files in each test case -# ------------------------------------------------------ -parser = argparse.ArgumentParser() -parser.add_argument( - "-c", - "--conf", - help="configuration files for the testcase, in yaml format", - default="/home/opnfv/bottlenecks/testsuites/vstf/testcase_cfg/vstf_Tu1.yaml") -args = parser.parse_args() - -#-------------------------------------------------- -# logging configuration -#-------------------------------------------------- -logger = logging.getLogger(__name__) - - -def _get_keystone_client(): - keystone_client = KeystoneClient( - auth_url=os.environ.get('OS_AUTH_URL'), - username=os.environ.get('OS_USERNAME'), - password=os.environ.get('OS_PASSWORD'), - tenant_name=os.environ.get('OS_TENANT_NAME'), - cacert=os.environ.get('OS_CACERT')) - return keystone_client - - -def _get_heat_client(): - keystone = _get_keystone_client() - heat_endpoint = keystone.service_catalog.url_for( - service_type='orchestration') - heat_client = HeatClient( - '1', - endpoint=heat_endpoint, - token=keystone.auth_token) - return heat_client - - -def _get_glance_client(): - keystone = _get_keystone_client() - glance_endpoint = keystone.service_catalog.url_for( - service_type='image', endpoint_type='publicURL') - return GlanceClient(glance_endpoint, token=keystone.auth_token) - - -def _get_nova_client(): - nova_client = NovaClient("2", os.environ.get('OS_USERNAME'), - os.environ.get('OS_PASSWORD'), - os.environ.get('OS_TENANT_NAME'), - os.environ.get('OS_AUTH_URL')) - return nova_client - - -def _download_url(src_url, dest_dir): - ''' Download a file to a destination path given a URL''' - file_name = src_url.rsplit('/')[-1] - dest = dest_dir + "/" + file_name - try: - response = urllib2.urlopen(src_url) - except (urllib2.HTTPError, urllib2.URLError): - return None - - with open(dest, 'wb') as f: - shutil.copyfileobj(response, f) - return dest - - -def vstf_stack_satisfy( - name="bottlenecks_vstf_stack", - status="CREATE_COMPLETE"): - heat = _get_heat_client() - for stack in heat.stacks.list(): - if status is None and stack.stack_name == name: - # Found target stack - print "Found stack, name=" + str(stack.stack_name) - return True - elif stack.stack_name == name and stack.stack_status == status: - print "Found stack, name=" + str(stack.stack_name) + ", status=" + str(stack.stack_status) - return True - return False - - -def vstf_env_prepare(template=None): - print "========== Prepare vstf environment ==========" - logger.info("env preparation for testcase.") - - -def vstf_env_cleanup(): - print "========== Cleanup vstf environment ==========" - glance = _get_glance_client() - heat = _get_heat_client() - nova = _get_nova_client() - - for image in glance.images.list(): - if image.name.find("bottlenecks_vstf") >= 0: - print "Delete image, id:" + str(image.id) + ", name:" + str(image.name) - glance.images.delete(image.id) - - for keypair in nova.keypairs.list(): - if keypair.name.find("bottlenecks_vstf") >= 0: - print "Delete keypair, id:" + str(keypair.id) + ", name:" + str(keypair.name) - nova.keypairs.delete(keypair.id) - - for flavor in nova.flavors.list(): - if flavor.name.find("bottlenecks_vstf") >= 0: - print "Delete flavor, id:" + str(flavor.id) + ", name:" + str(flavor.name) - nova.flavors.delete(flavor.id) - - for stack in heat.stacks.list(): - if stack.stack_name.find("bottlenecks_vstf") >= 0: - print "Delete stack, id: " + str(stack.id) + ", name:" + str(stack.stack_name) - heat.stacks.delete(stack.id) - - timeInProgress = 0 - while vstf_stack_satisfy( - name="bottlenecks_vstf_stack", - status=None) and timeInProgress < 60: - time.sleep(5) - timeInProgress = timeInProgress + 5 - - if vstf_stack_satisfy(name="bottlenecks_vstf_stack", status=None): - print "Failed to clean the stack" - return False - else: - return True - - -def vstf_create_images(imagefile=None, image_name="bottlenecks_vstf_image"): - print "========== Create vstf image in OS ==========" - - if imagefile is None: - print "imagefile not set/found" - return False - - glance = _get_glance_client() - image = glance.images.create( - name=image_name, - disk_format="qcow2", - container_format="bare") - with open(imagefile) as fimage: - glance.images.upload(image.id, fimage) - - timeInQueue = 0 - img_status = image.status - while img_status == "queued" and timeInQueue < 30: - print " image's status: " + img_status - time.sleep(1) - timeInQueue = timeInQueue + 1 - img_status = glance.images.get(image.id).status - - print "After %d seconds, the image's status is [%s]" % (timeInQueue, img_status) - return True if img_status == "active" else False - - -def vstf_create_keypairs(key_path, name="bottlenecks_vstf_keypair"): - print "========== Add vstf keypairs in OS ==========" - nova = _get_nova_client() - with open(key_path) as pkey: - nova.keypairs.create(name=name, public_key=pkey.read()) - - -def vstf_create_flavors( - name="bottlenecks_vstf_flavor", - ram=4096, - vcpus=2, - disk=10): - print "========== Create vstf flavors in OS ==========" - nova = _get_nova_client() - nova.flavors.create(name=name, ram=ram, vcpus=vcpus, disk=disk) - - -def vstf_create_instances( - template_file, - vstf_parameters=None, - stack_name="bottlenecks_vstf_stack"): - print "========== Create vstf instances ==========" - heat = _get_heat_client() - - with open(template_file) as template: - stack = heat.stacks.create( - stack_name=stack_name, - template=template.read(), - parameters=vstf_parameters) - - stack_id = stack['stack']['id'] - stack_status = heat.stacks.get(stack_id).stack_status - - print "Created stack, id=" + str(stack_id) + ", status=" + str(stack_status) - - timeInProgress = 0 - while stack_status == "CREATE_IN_PROGRESS" and timeInProgress < 150: - print " stack's status: %s, after %d seconds" % (stack_status, timeInProgress) - time.sleep(5) - timeInProgress = timeInProgress + 5 - stack_status = heat.stacks.get(stack_id).stack_status - - print "After %d seconds, the stack's status is [%s]" % (timeInProgress, stack_status) - return True if stack_status == "CREATE_COMPLETE" else False - - -def get_instances(nova_client): - try: - instances = nova_client.servers.list(search_opts={'all_tenants': 1}) - return instances - except Exception as e: - print "Error [get_instances(nova_client)]:", e - return None - - -def vstf_run(launch_file=None, test_file=None): - print "================run vstf===============" - - heat = _get_heat_client() - nova = _get_nova_client() - print(nova.servers.list()) - print "## neutruon net-list:" - subprocess.call("neutron net-list", shell=True) - print "## nova list:" - subprocess.call("nova list", shell=True) - time.sleep(100) - instances = get_instances(nova) - if instances is None: - print "Found *None* instances, exit vstf_run()!" - return False - if launch_file is None or test_file is None: - print "Error, vstf launch/test file not given" - return False - cmd = "bash " + launch_file - subprocess.call(cmd, shell=True) - time.sleep(50) - cmd = "bash " + test_file - subprocess.call(cmd, shell=True) - time.sleep(20) - - -def main(): - - # same in Dockerfile, docker directory - Bottlenecks_repo_dir = "/home/opnfv/bottlenecks" - Heat_template = Bottlenecks_repo_dir + \ - "/testsuites/vstf/testcase_cfg/vstf_heat_template.yaml" - manager_image_url = 'http://artifacts.opnfv.org/bottlenecks/vstf-manager-new.img' - agent_image_url = 'http://artifacts.opnfv.org/bottlenecks/vstf-agent-new.img' - - # vstf_env_prepare(testcase_cfg) - vstf_env_cleanup() - - dest_dir = "/tmp" - manager_file = _download_url(manager_image_url, dest_dir) - if manager_file is None: - print "error with downloading image(s)" - exit(-1) - agent_file = _download_url(agent_image_url, dest_dir) - if agent_file is None: - print "error with downloading image(s)" - exit(-1) - - # TO DO:the parameters are all used defaults here, it should be changed - # depends on what it is really named - parameters = {'key_name': 'bottlenecks_vstf_keypair', - 'flavor': 'bottlenecks_vstf_flavor', - 'public_net': os.environ.get('EXTERNAL_NET')} - - print "Heat_template_file: " + Heat_template - print "parameters:\n" + str(parameters) - - if not (args.conf): - logger.error("Configuration files are not set for testcase") - exit(-1) - else: - testcase_cfg = args.conf - - manager_image_created = False - tester_image_created = False - target_image_created = False - stack_created = False - - manager_image_created = vstf_create_images( - imagefile=manager_file, - image_name="bottlenecks_vstf_manager") - tester_image_created = vstf_create_images( - imagefile=agent_file, image_name="bottlenecks_vstf_tester") - target_image_created = vstf_create_images( - imagefile=agent_file, image_name="bottlenecks_vstf_target") - keyPath = Bottlenecks_repo_dir + \ - "/utils/infra_setup/bottlenecks_key/bottlenecks_key.pub" - vstf_create_keypairs(key_path=keyPath) - vstf_create_flavors() - - if manager_image_created and tester_image_created and target_image_created: - stack_created = vstf_create_instances( - template_file=Heat_template, - vstf_parameters=parameters, - stack_name="bottlenecks_vstf_stack") - else: - print "Cannot create instances, as Failed to create image(s)." - exit(-1) - - print "Wait 300 seconds after stack creation..." - time.sleep(300) - - launchfile = Bottlenecks_repo_dir + \ - "/utils/infra_setup/heat_template/vstf_heat_template/launch_vstf.sh" - testfile = Bottlenecks_repo_dir + \ - "/utils/infra_setup/heat_template/vstf_heat_template/vstf_test.sh" - vstf_run(launch_file=launchfile, test_file=testfile) - - vstf_env_cleanup() - -if __name__ == '__main__': - main() diff --git a/testsuites/vstf/testcase_cfg/vstf_Ti1.yaml b/testsuites/vstf/testcase_cfg/vstf_Ti1.yaml deleted file mode 100644 index 071c7ad9..00000000 --- a/testsuites/vstf/testcase_cfg/vstf_Ti1.yaml +++ /dev/null @@ -1,16 +0,0 @@ -############################################################################## -# Copyright (c) 2016 HUAWEI TECHNOLOGIES CO.,LTD and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -tool: netperf -protocol: udp -type: frameloss -sizes: 64, 128, 512, 1024 -senders: 0 -receivers: -1 -flows: 1 diff --git a/testsuites/vstf/testcase_cfg/vstf_Ti2.yaml b/testsuites/vstf/testcase_cfg/vstf_Ti2.yaml deleted file mode 100644 index 8970d48d..00000000 --- a/testsuites/vstf/testcase_cfg/vstf_Ti2.yaml +++ /dev/null @@ -1,16 +0,0 @@ -############################################################################## -# Copyright (c) 2016 HUAWEI TECHNOLOGIES CO.,LTD and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -tool: pktgen -protocol: udp -type: frameloss -sizes: 64, 128, 512, 1024 -senders: -1 -receivers: 0 -flows: 1 diff --git a/testsuites/vstf/testcase_cfg/vstf_Ti3.yaml b/testsuites/vstf/testcase_cfg/vstf_Ti3.yaml deleted file mode 100644 index c0a07433..00000000 --- a/testsuites/vstf/testcase_cfg/vstf_Ti3.yaml +++ /dev/null @@ -1,16 +0,0 @@ -############################################################################## -# Copyright (c) 2016 HUAWEI TECHNOLOGIES CO.,LTD and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -tool: pktgen -protocol: udp -type: frameloss -sizes: 64, 128, 512, 1024 -senders: 0, -1 -receivers: -1, 0 -flows: 2 diff --git a/testsuites/vstf/testcase_cfg/vstf_Tn1.yaml b/testsuites/vstf/testcase_cfg/vstf_Tn1.yaml deleted file mode 100644 index 071c7ad9..00000000 --- a/testsuites/vstf/testcase_cfg/vstf_Tn1.yaml +++ /dev/null @@ -1,16 +0,0 @@ -############################################################################## -# Copyright (c) 2016 HUAWEI TECHNOLOGIES CO.,LTD and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -tool: netperf -protocol: udp -type: frameloss -sizes: 64, 128, 512, 1024 -senders: 0 -receivers: -1 -flows: 1 diff --git a/testsuites/vstf/testcase_cfg/vstf_Tn2.yaml b/testsuites/vstf/testcase_cfg/vstf_Tn2.yaml deleted file mode 100644 index c0a07433..00000000 --- a/testsuites/vstf/testcase_cfg/vstf_Tn2.yaml +++ /dev/null @@ -1,16 +0,0 @@ -############################################################################## -# Copyright (c) 2016 HUAWEI TECHNOLOGIES CO.,LTD and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -tool: pktgen -protocol: udp -type: frameloss -sizes: 64, 128, 512, 1024 -senders: 0, -1 -receivers: -1, 0 -flows: 2 diff --git a/testsuites/vstf/testcase_cfg/vstf_Tu1.yaml b/testsuites/vstf/testcase_cfg/vstf_Tu1.yaml deleted file mode 100644 index 071c7ad9..00000000 --- a/testsuites/vstf/testcase_cfg/vstf_Tu1.yaml +++ /dev/null @@ -1,16 +0,0 @@ -############################################################################## -# Copyright (c) 2016 HUAWEI TECHNOLOGIES CO.,LTD and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -tool: netperf -protocol: udp -type: frameloss -sizes: 64, 128, 512, 1024 -senders: 0 -receivers: -1 -flows: 1 diff --git a/testsuites/vstf/testcase_cfg/vstf_Tu2.yaml b/testsuites/vstf/testcase_cfg/vstf_Tu2.yaml deleted file mode 100644 index 8970d48d..00000000 --- a/testsuites/vstf/testcase_cfg/vstf_Tu2.yaml +++ /dev/null @@ -1,16 +0,0 @@ -############################################################################## -# Copyright (c) 2016 HUAWEI TECHNOLOGIES CO.,LTD and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -tool: pktgen -protocol: udp -type: frameloss -sizes: 64, 128, 512, 1024 -senders: -1 -receivers: 0 -flows: 1 diff --git a/testsuites/vstf/testcase_cfg/vstf_Tu3.yaml b/testsuites/vstf/testcase_cfg/vstf_Tu3.yaml deleted file mode 100644 index f6880c81..00000000 --- a/testsuites/vstf/testcase_cfg/vstf_Tu3.yaml +++ /dev/null @@ -1,16 +0,0 @@ -############################################################################## -# Copyright (c) 2016 HUAWEI TECHNOLOGIES CO.,LTD and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -tool: netperf -protocol: udp -type: frameloss -sizes: 64, 128, 512, 1024 -senders: 0, -1 -receivers: -1, 0 -flows: 2 diff --git a/testsuites/vstf/testcase_cfg/vstf_heat_template.yaml b/testsuites/vstf/testcase_cfg/vstf_heat_template.yaml deleted file mode 100644 index 67d4c180..00000000 --- a/testsuites/vstf/testcase_cfg/vstf_heat_template.yaml +++ /dev/null @@ -1,261 +0,0 @@ -############################################################################## -# Copyright (c) 2016 HUAWEI TECHNOLOGIES CO.,LTD and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -heat_template_version: 2013-05-23 -description: > - This template is used for creating a new environment on the Openstack Release L , - and the deployment will create three virtual machine on the compute node, one manager - and two agent vm included. Each vm will has a nic on the controlplane switch and two - agent vms will has a additional nic on the dataplane. -parameters: - #nova keypair-list to query available key pair - key_name: - type: string - description: Name of keypair to assign to servers - default: bottlenecks_vstf_keypair - #nova image-list to query available images - image: - type: string - description: Name of image to use for servers - default: bottlenecks-trusty-server - #new addition image for the actual deployment - image_vstf_manager: - type: string - description: Name of image to use for servers - default: bottlenecks_vstf_manager - image_vstf_tester: - type: string - description: Name of image to use for servers - default: bottlenecks_vstf_tester - image_vstf_target: - type: string - description: Name of image to use for servers - default: bottlenecks_vstf_target - #nova flavor-list to query available flavors - flavor: - type: string - description: Flavor to use for servers - default: m1.large - #nova net-list to query available - public_net: - type: string - description: > - ID or name of public network for which floating IP addresses will be allocated - default: net04_ext - - #private controlplane - private_net_name: - type: string - description: Name of private network to be created - default: vstf-private - private_net_cidr: - type: string - description: Private network address (CIDR notation) - default: "10.0.11.0/24" - private_net_gateway: - type: string - description: Private network gateway address - default: "10.0.11.1" - private_net_pool_start: - type: string - description: Start of private network IP address allocation pool - default: "10.0.11.2" - private_net_pool_end: - type: string - description: End of private network IP address allocation pool - default: "10.0.11.199" - - #testing dataplane - testing_net_name: - type: string - description: Name of private network to be created - default: bottlenecks-testing - testing_net_cidr: - type: string - description: Private network address (CIDR notation) - default: "10.0.20.0/24" - testing_net_gateway: - type: string - description: Private network gateway address - default: "10.0.20.1" - testing_net_pool_start: - type: string - description: Start of private network IP address allocation pool - default: "10.0.20.2" - testing_net_pool_end: - type: string - description: End of private network IP address allocation pool - default: "10.0.20.199" - - -resources: - #control plane - private_net: - type: OS::Neutron::Net - properties: - name: { get_param: private_net_name } - private_subnet: - type: OS::Neutron::Subnet - properties: - network_id: { get_resource: private_net } - cidr: { get_param: private_net_cidr } - gateway_ip: { get_param: private_net_gateway } - allocation_pools: - - start: { get_param: private_net_pool_start } - end: { get_param: private_net_pool_end } - - #dataplane - testing_net: - type: OS::Neutron::Net - properties: - name: { get_param: testing_net_name } - testing_subnet: - type: OS::Neutron::Subnet - properties: - network_id: { get_resource: testing_net } - cidr: { get_param: testing_net_cidr } - gateway_ip: { get_param: testing_net_gateway } - allocation_pools: - - start: { get_param: testing_net_pool_start } - end: { get_param: testing_net_pool_end } - - #router info - router: - type: OS::Neutron::Router - properties: - external_gateway_info: - network: { get_param: public_net } - router_interface: - type: OS::Neutron::RouterInterface - properties: - router_id: { get_resource: router } - subnet_id: { get_resource: private_subnet } - - #security_group - server_security_group: - type: OS::Neutron::SecurityGroup - properties: - description: vstf group for servers access. - name: vstf-security-group - rules: [ - {remote_ip_prefix: 0.0.0.0/0, - protocol: tcp, - port_range_min: 1, - port_range_max: 65535}, - {remote_ip_prefix: 0.0.0.0/0, - protocol: udp, - port_range_min: 1, - port_range_max: 65535}, - {remote_ip_prefix: 0.0.0.0/0, - protocol: icmp}] - - #nova server vstf manager definition info - vstf-manager: - type: OS::Nova::Server - properties: - name: vstf-manager - image: { get_param: image_vstf_manager } - flavor: { get_param: flavor } - key_name: { get_param: key_name } - networks: - - port: { get_resource: manager_control_port } - manager_control_port: - type: OS::Neutron::Port - properties: - network_id: { get_resource: private_net } - fixed_ips: - - subnet_id: { get_resource: private_subnet } - security_groups: [{ get_resource: server_security_group }] - manager_control_floating_ip: - type: OS::Neutron::FloatingIP - properties: - floating_network: { get_param: public_net } - port_id: { get_resource: manager_control_port } - - #nova server vstf target definition info - vstf-target: - type: OS::Nova::Server - properties: - name: vstf-target - image: { get_param: image_vstf_target } - flavor: { get_param: flavor } - key_name: { get_param: key_name } - networks: - - port: { get_resource: target_control_port } - - port: { get_resource: target_testing_port } - target_control_port: - type: OS::Neutron::Port - properties: - network_id: { get_resource: private_net } - fixed_ips: - - subnet_id: { get_resource: private_subnet } - security_groups: [{ get_resource: server_security_group }] - target_testing_port: - type: OS::Neutron::Port - properties: - network_id: { get_resource: testing_net } - fixed_ips: - - subnet_id: { get_resource: testing_subnet } - security_groups: [{ get_resource: server_security_group }] - target_control_floating_ip: - type: OS::Neutron::FloatingIP - properties: - floating_network: { get_param: public_net } - port_id: { get_resource: target_control_port } - - #nova server vstf tester definition info - vstf-tester: - type: OS::Nova::Server - properties: - name: vstf-tester - image: { get_param: image_vstf_tester } - flavor: { get_param: flavor } - key_name: { get_param: key_name } - networks: - - port: { get_resource: tester_control_port } - - port: { get_resource: tester_testing_port } - tester_control_port: - type: OS::Neutron::Port - properties: - network_id: { get_resource: private_net } - fixed_ips: - - subnet_id: { get_resource: private_subnet } - security_groups: [{ get_resource: server_security_group }] - tester_testing_port: - type: OS::Neutron::Port - properties: - network_id: { get_resource: testing_net } - fixed_ips: - - subnet_id: { get_resource: testing_subnet } - security_groups: [{ get_resource: server_security_group }] - tester_control_floating_ip: - type: OS::Neutron::FloatingIP - properties: - floating_network: { get_param: public_net } - port_id: { get_resource: tester_control_port } - -outputs: - manager_control_private_ip: - description: IP address of manager_control in private network - value: { get_attr: [ vstf-manager, first_address ] } - manager_control_public_ip: - description: Floating IP address of manager_control in public network - value: { get_attr: [ manager_control_floating_ip, floating_ip_address ] } - target_control_private_ip: - description: IP address of manager_control in private network - value: { get_attr: [ vstf-target, first_address ] } - target_control_public_ip: - description: Floating IP address of manager_control in public network - value: { get_attr: [ target_control_floating_ip, floating_ip_address ] } - tester_control_private_ip: - description: IP address of manager_control in private network - value: { get_attr: [ vstf-tester, first_address ] } - tester_control_public_ip: - description: Floating IP address of manager_control in public network - value: { get_attr: [ tester_control_floating_ip, floating_ip_address ] } diff --git a/testsuites/vstf/testsuite_story/vstf_story1 b/testsuites/vstf/testsuite_story/vstf_story1 deleted file mode 100755 index 8e855e62..00000000 --- a/testsuites/vstf/testsuite_story/vstf_story1 +++ /dev/null @@ -1 +0,0 @@ -vstf_Tu1 diff --git a/testsuites/vstf/testsuite_story/vstf_story2 b/testsuites/vstf/testsuite_story/vstf_story2 deleted file mode 100755 index eacb1bc5..00000000 --- a/testsuites/vstf/testsuite_story/vstf_story2 +++ /dev/null @@ -1 +0,0 @@ -vstf_Tn diff --git a/testsuites/vstf/vstf_collector.py b/testsuites/vstf/vstf_collector.py deleted file mode 100755 index af11bc66..00000000 --- a/testsuites/vstf/vstf_collector.py +++ /dev/null @@ -1,80 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd. and others -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## -import os -import argparse -import json -import requests -import logging - -LOG = logging.getLogger(__name__) - - -class Uploader(object): - - def __init__(self, conf): - self.headers = {'Content-type': 'application/json'} - self.timeout = 5 - self.result = { - "project_name": "bottlenecks", - "description": "bottlenecks test cases result"} - - with open(conf) as stream: - dashboard_conf = json.load(stream) - self.result['pod_name'] = dashboard_conf['pod_name'] - self.result['installer'] = dashboard_conf['installer'] - self.result['version'] = dashboard_conf['version'] - self.target = dashboard_conf['target'] - - def upload_result(self, case_name, raw_data): - if self.target == '': - LOG.error('No target was set, so no data will be posted.') - return - self.result["case_name"] = case_name - self.result["details"] = raw_data - try: - LOG.debug( - 'Result to be uploaded:\n %s' % - json.dumps( - self.result, - indent=4)) - res = requests.post(self.target, - data=json.dumps(self.result), - headers=self.headers, - timeout=self.timeout) - print( - 'Test result posting finished with status code %d.' % - res.status_code) - except Exception as err: - LOG.error('Failed to record result data: %s', err) - - -if __name__ == "__main__": - logging.basicConfig(level=logging.DEBUG) - parser = argparse.ArgumentParser() - parser.add_argument( - '--config', - required=True, - help="basic config file for uploader, json format.") - parser.add_argument( - '--dir', - required=True, - help="result files for test cases") - args = parser.parse_args() - realpath = os.path.realpath(args.dir) - for filename in os.listdir(args.dir): - filepath = os.path.join(realpath, filename) - LOG.debug("uploading test result from file:%s", filepath) - with open(filepath) as stream: - result = eval(stream.read()) - Uploader( - args.config).upload_result( - filename.lower().replace( - '-', - ''), - result) diff --git a/testsuites/vstf/vstf_scripts/README.rst b/testsuites/vstf/vstf_scripts/README.rst deleted file mode 100644 index 45fd0094..00000000 --- a/testsuites/vstf/vstf_scripts/README.rst +++ /dev/null @@ -1,3 +0,0 @@ -Bottleneck testsuite VSTF -========================= -welcome to open vstf(Virtual Switch Test Framework) diff --git a/testsuites/vstf/vstf_scripts/__init__.py b/testsuites/vstf/vstf_scripts/__init__.py deleted file mode 100644 index 83b8d15d..00000000 --- a/testsuites/vstf/vstf_scripts/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## diff --git a/testsuites/vstf/vstf_scripts/etc/vstf/amqp/amqp.ini b/testsuites/vstf/vstf_scripts/etc/vstf/amqp/amqp.ini deleted file mode 100644 index 8f355e68..00000000 --- a/testsuites/vstf/vstf_scripts/etc/vstf/amqp/amqp.ini +++ /dev/null @@ -1,9 +0,0 @@ -[rabbit] -user=guest -passwd=guest -host=192.168.188.10 -port=5672 -id="local" -[spirent] -package='/home/Spirent_TestCenter_4.46/Spirent_TestCenter_Application_Linux' - diff --git a/testsuites/vstf/vstf_scripts/etc/vstf/default/reporters.html-settings b/testsuites/vstf/vstf_scripts/etc/vstf/default/reporters.html-settings deleted file mode 100644 index de75f70b..00000000 --- a/testsuites/vstf/vstf_scripts/etc/vstf/default/reporters.html-settings +++ /dev/null @@ -1,22 +0,0 @@ -{ - "style":{ - "table":{ - "font-family":"\"Trebuchet MS\", Arial, Helvetica, sans-serif", - "border":"1px solid green", - "border-collapse":"collapse", - "padding":"8px", - "text-align":"center" - }, - "td":{ - "border":"1px solid green", - "padding":"8px", - "word-wrap":"break-all" - }, - "th":{ - "background-color":"#EAF2D3", - "border":"1px solid green", - "padding":"8px" - } - } - -} diff --git a/testsuites/vstf/vstf_scripts/etc/vstf/default/reporters.mail.mail-settings b/testsuites/vstf/vstf_scripts/etc/vstf/default/reporters.mail.mail-settings deleted file mode 100644 index 89bbcb5f..00000000 --- a/testsuites/vstf/vstf_scripts/etc/vstf/default/reporters.mail.mail-settings +++ /dev/null @@ -1,21 +0,0 @@ -//Place your settings in the file "user/reporters.mail.mail-settings", -//which overrides the settings in here. -{ - "server": - { - "host": "localhost", - "username": null, - "password": null - }, - "body": - { - "from": ["vstf_from@vstf.com"], - "to": ["vstf_to@vstf.com"], - "cc": ["vstf_cc@vstf.com"], - "bcc": ["vstf_bcc@vstf.com"], - "subject": "Virtual Switching Performance Test Report" - } -} - - - diff --git a/testsuites/vstf/vstf_scripts/etc/vstf/default/sw_perf.tool-settings b/testsuites/vstf/vstf_scripts/etc/vstf/default/sw_perf.tool-settings deleted file mode 100644 index e72a0bc2..00000000 --- a/testsuites/vstf/vstf_scripts/etc/vstf/default/sw_perf.tool-settings +++ /dev/null @@ -1,29 +0,0 @@ -//Place your settings in the file "user/sw_perf.tool-settings", -//which overrides the settings in here. -{ - "pktgen":{ - "threads": 2, - "wait": 5, - "time": 20 - }, - "netperf":{ - "threads": 2, - "wait": 5, - "time": 20 - }, - "qperf":{ - "threads": 1, - "wait": 5, - "time": 2 - }, - "iperf":{ - "threads": 1, - "wait": 5, - "time": 20 - }, - "netmap":{ - "threads": 1, - "wait": 12, - "time": 20 - } -} \ No newline at end of file diff --git a/testsuites/vstf/vstf_scripts/etc/vstf/env/Ti.json b/testsuites/vstf/vstf_scripts/etc/vstf/env/Ti.json deleted file mode 100644 index d122ddde..00000000 --- a/testsuites/vstf/vstf_scripts/etc/vstf/env/Ti.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "env-build": [ - { - "ip": "192.168.188.14", - "drivers": [ - "ixgbe" - ] - }, - { - "ip": "192.168.188.16", - "drivers": [ - "ixgbe", - "vhost_net" - ], - "bridges": [ - { - "type": "ovs", - "name": "ovs1", - "uplinks": [ - { - "bdf": "04:00.0", - "vlan_mode": "trunk", - "vlan_id": "1,100,200,300,400" - } - ], - "vtep": {}, - "fastlink": [ - { - "inport": "04:00.0", - "outport": "tap0" - } - ] - } - ], - "vms": [ - { - "vm_cpu": 3, - "vm_name": "test1", - "vm_memory": 4194304, - "image_path": "/mnt/sdb/test1.qcow2", - "image_type": "qcow2", - "init_config": { - "amqp_server": "192.168.188.10", - "ctrl_ip_setting": "192.168.188.200/23", - "ctrl_gw": "192.168.188.1" - }, - "taps": [ - { - "tap_name": "tap0", - "br_type": "ovs", - "br_name": "ovs1", - "tap_mac": "56:6f:44:a5:3f:a2", - "vlan_mode": "access", - "vlan_id": "1" - } - ], - "ctrl_mac": "16:6f:44:a5:3f:a2", - "ctrl_br": "br0" - } - ] - } - ] -} diff --git a/testsuites/vstf/vstf_scripts/etc/vstf/env/Tn.json b/testsuites/vstf/vstf_scripts/etc/vstf/env/Tn.json deleted file mode 100644 index f731457e..00000000 --- a/testsuites/vstf/vstf_scripts/etc/vstf/env/Tn.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "env-build": [ - { - "ip": "192.168.188.16", - "drivers": [ - "ixgbe" - ], - "bridges": [ - { - "type": "ovs", - "name": "ovs1", - "uplinks": [ - { - "bdf": "04:00.0", - "vlan_mode": "trunk", - "vlan_id": "1,100,200" - }, - { - "bdf": "04:00.1", - "vlan_mode": "trunk", - "vlan_id": "1,100,200" - } - ], - "vtep": {}, - "fastlink": [ - { - "inport": "04:00.0", - "outport": "04:00.1" - } - ] - } - ], - "vms": [] - } - ] -} diff --git a/testsuites/vstf/vstf_scripts/etc/vstf/env/Tnv.json b/testsuites/vstf/vstf_scripts/etc/vstf/env/Tnv.json deleted file mode 100644 index 3697dbbf..00000000 --- a/testsuites/vstf/vstf_scripts/etc/vstf/env/Tnv.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "env-build": [ - { - "ip": "192.168.188.16", - "drivers": [ - "ixgbe", - "vhost_net" - ], - "bridges": [ - { - "type": "ovs", - "name": "ovs1", - "uplinks": [ - { - "bdf": "04:00.0", - "vlan_mode": "access", - "vlan_id": "1" - } - ], - "vtep": {}, - "fastlink": [ - { - "inport": "04:00.0", - "outport": "tap0" - } - ] - }, - { - "type": "ovs", - "name": "ovs2", - "uplinks": [ - { - "bdf": "04:00.1", - "vlan_mode": "access", - "vlan_id": "1" - } - ], - "vtep": {}, - "fastlink": [ - { - "inport": "04:00.1", - "outport": "tap1" - } - ] - } - ], - "vms": [ - { - "vm_cpu": 3, - "vm_name": "test1", - "vm_memory": 4194304, - "image_path": "/mnt/sdb/test1.qcow2", - "image_type": "qcow2", - "init_config": { - "amqp_server": "192.168.188.10", - "ctrl_ip_setting": "192.168.188.200/23", - "tap_pktloop_config": "dpdk", - "ctrl_gw": "192.168.188.1" - }, - "taps": [ - { - "tap_name": "tap0", - "br_type": "ovs", - "br_name": "ovs1", - "tap_mac": "56:6f:44:a5:3f:a2", - "vlan_mode": "access", - "vlan_id": "1" - }, - { - "tap_name": "tap1", - "br_type": "ovs", - "br_name": "ovs2", - "tap_mac": "56:6f:44:a5:3f:a3", - "vlan_mode": "access", - "vlan_id": "1" - } - ], - "ctrl_br": "br0", - "ctrl_model": "rtl8139" - } - ] - } - ] -} \ No newline at end of file diff --git a/testsuites/vstf/vstf_scripts/etc/vstf/env/Tu.json b/testsuites/vstf/vstf_scripts/etc/vstf/env/Tu.json deleted file mode 100644 index 95bb81fc..00000000 --- a/testsuites/vstf/vstf_scripts/etc/vstf/env/Tu.json +++ /dev/null @@ -1,70 +0,0 @@ -{ - "env-build": [ - { - "ip": "192.168.188.16", - "drivers": [ - "vhost_net" - ], - "bridges": [ - { - "type": "ovs", - "name": "ovs1", - "uplinks": [], - "vtep": {}, - "fastlink": [ - { - "inport": "tap0", - "outport": "tap1" - } - ] - } - ], - "vms": [ - { - "vm_cpu": 3, - "vm_name": "test1", - "vm_memory": 4194304, - "image_path": "/mnt/sdb/test1.qcow2", - "image_type": "qcow2", - "init_config": { - "amqp_server": "192.168.188.10", - "ctrl_ip_setting": "192.168.188.200/23", - "ctrl_gw": "192.168.188.1" - }, - "taps": [ - { - "tap_name": "tap0", - "br_type": "ovs", - "br_name": "ovs1", - "tap_mac": "56:6f:44:a5:3f:a2", - "vlan_mode": "access", - "vlan_id": "100" - } - ] - }, - { - "vm_cpu": 3, - "vm_name": "test2", - "vm_memory": 4194304, - "image_path": "/mnt/sdb/test2.qcow2", - "image_type": "qcow2", - "init_config": { - "amqp_server": "192.168.188.10", - "ctrl_ip_setting": "192.168.188.201/23", - "ctrl_gw": "192.168.188.1" - }, - "taps": [ - { - "tap_name": "tap1", - "br_type": "ovs", - "br_name": "ovs1", - "tap_mac": "56:6f:44:a5:3f:a4", - "vlan_mode": "access", - "vlan_id": "100" - } - ] - } - ] - } - ] -} diff --git a/testsuites/vstf/vstf_scripts/etc/vstf/env/eth2eth.json b/testsuites/vstf/vstf_scripts/etc/vstf/env/eth2eth.json deleted file mode 100644 index 5662ae15..00000000 --- a/testsuites/vstf/vstf_scripts/etc/vstf/env/eth2eth.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "env-build": [ - { - "ip": "hostA", - "drivers": ["ixgbe"], - "bridges": [], - "vms": [] - }, - { - "ip": "hostB", - "drivers": ["ixgbe"], - "bridges": [], - "vms": [] - } - ] -} diff --git a/testsuites/vstf/vstf_scripts/etc/vstf/env/images.json b/testsuites/vstf/vstf_scripts/etc/vstf/env/images.json deleted file mode 100644 index a1c187cd..00000000 --- a/testsuites/vstf/vstf_scripts/etc/vstf/env/images.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent_image": "/mnt/sdb/ubuntu_salt_master.img", - "dst_location": "/mnt/sdb", - "full_clone":false, - "type": "qcow2", - "names": ["test1","test2","test3","test4"] -} diff --git a/testsuites/vstf/vstf_scripts/etc/vstf/env/src.json b/testsuites/vstf/vstf_scripts/etc/vstf/env/src.json deleted file mode 100644 index 391b084c..00000000 --- a/testsuites/vstf/vstf_scripts/etc/vstf/env/src.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "vnx-bin":{ - "install":true, - "url": "root@192.168.188.10:/root/src/vnx-bin", - "repo_type": "git" - } -} diff --git a/testsuites/vstf/vstf_scripts/etc/vstf/env/tester.json b/testsuites/vstf/vstf_scripts/etc/vstf/env/tester.json deleted file mode 100644 index 213658df..00000000 --- a/testsuites/vstf/vstf_scripts/etc/vstf/env/tester.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "drivers": ["ixgbe"] -} \ No newline at end of file diff --git a/testsuites/vstf/vstf_scripts/etc/vstf/perf/sw_perf.batch-settings b/testsuites/vstf/vstf_scripts/etc/vstf/perf/sw_perf.batch-settings deleted file mode 100644 index 83c6970d..00000000 --- a/testsuites/vstf/vstf_scripts/etc/vstf/perf/sw_perf.batch-settings +++ /dev/null @@ -1,80 +0,0 @@ -{ - "Tn":[ - { - "case": "Tn-1", - "tool": "netperf", - "protocol": "udp", - "type": "frameloss", - "sizes": [64, 128, 512, 1024] - }, - { - "case": "Tn-2", - "tool": "pktgen", - "protocol": "udp", - "type": "frameloss", - "sizes": [64, 128, 512, 1024] - } - ], - "Ti":[ - { - "case": "Ti-1", - "tool": "netperf", - "protocol": "udp", - "type": "frameloss", - "sizes": [64, 128, 512, 1024] - }, - { - "case": "Ti-2", - "tool": "pktgen", - "protocol": "udp", - "type": "frameloss", - "sizes": [64, 128, 512, 1024] - }, - { - "case": "Ti-3", - "tool": "pktgen", - "protocol": "udp", - "type": "frameloss", - "sizes": [64, 128, 512, 1024] - } - ], - "Tnv":[ - { - "case": "Tnv-1", - "tool": "netmap", - "protocol": "udp", - "type": "frameloss", - "sizes": [64, 128, 512, 1024] - }, - { - "case": "Tnv-2", - "tool": "netperf", - "protocol": "udp", - "type": "frameloss", - "sizes": [64, 128, 512, 1024] - } - ], - "Tu":[ - { - "case": "Tu-1", - "tool": "netperf", - "protocol": "udp", - "type": "frameloss", - "sizes": [64, 128, 512, 1024] - }, - { - "case": "Tu-2", - "tool": "pktgen", - "protocol": "udp", - "type": "frameloss", - "sizes": [64, 128, 512, 1024] - }, - { - "case": "Tu-3", - "tool": "netperf", - "protocol": "udp", - "type": "frameloss", - "sizes": [64, 128, 512, 1024] - } - ] -} \ No newline at end of file diff --git a/testsuites/vstf/vstf_scripts/etc/vstf/perf/sw_perf.cpu-settings b/testsuites/vstf/vstf_scripts/etc/vstf/perf/sw_perf.cpu-settings deleted file mode 100644 index 77b9304c..00000000 --- a/testsuites/vstf/vstf_scripts/etc/vstf/perf/sw_perf.cpu-settings +++ /dev/null @@ -1,5 +0,0 @@ -{ - "affctl":{ - "policy": 2 - } -} \ No newline at end of file diff --git a/testsuites/vstf/vstf_scripts/etc/vstf/perf/sw_perf.device-settings b/testsuites/vstf/vstf_scripts/etc/vstf/perf/sw_perf.device-settings deleted file mode 100644 index e0dac25a..00000000 --- a/testsuites/vstf/vstf_scripts/etc/vstf/perf/sw_perf.device-settings +++ /dev/null @@ -1,56 +0,0 @@ -{ - "tester":{ - "agent": "192.168.188.14", - "devs": [ - { - "bdf": "04:00.0" - }, - { - "bdf": "04:00.1" - } - ] - }, - "host":{ - "agent": "192.168.188.16", - "devs": [ - { - "bdf": "04:00.0" - }, - { - "bdf": "04:00.1" - }, - { - "iface": "tap0" - }, - { - "iface": "tap1" - } - ] - }, - "vm-200":{ - "agent": "192.168.188.185", - "devs": [ - { - "mac": "56:6f:44:a5:3f:a2" - }, - { - "mac": "56:6f:44:a5:3f:a3" - } - ] - }, - "vm-201":{ - "agent": "192.168.188.186", - "devs": [ - { - "mac": "56:6f:44:a5:3f:a4" - }, - { - "mac": "56:6f:44:a5:3f:a5" - } - ] - }, - "tables":{ - "vm-201": "host", - "vm-200": "host" - } -} diff --git a/testsuites/vstf/vstf_scripts/etc/vstf/perf/sw_perf.flownodes-settings b/testsuites/vstf/vstf_scripts/etc/vstf/perf/sw_perf.flownodes-settings deleted file mode 100644 index c9cc75b7..00000000 --- a/testsuites/vstf/vstf_scripts/etc/vstf/perf/sw_perf.flownodes-settings +++ /dev/null @@ -1,99 +0,0 @@ -{ - "cpu_listens":[ - { - "agent":"192.168.188.16", - "affctl":{ - "policy": 2 - } - } - ], - "flows":2, - "namespaces":[ - { - "agent":"192.168.188.14", - "dev":{ - "bdf":"04:00.0", - "iface":"eth4", - "ip":"192.168.1.100", - "mac":"90:e2:ba:20:1f:d8", - "namespace":"vstf-space-1" - } - }, - { - "agent":"192.168.188.14", - "dev":{ - "bdf":"04:00.1", - "iface":"p57p2", - "ip":"192.168.1.101", - "mac":"90:e2:ba:20:1f:d9", - "namespace":"vstf-space-2" - } - } - ], - "receivers":[ - { - "agent":"192.168.188.14", - "dev":{ - "bdf":"04:00.1", - "iface":"p57p2", - "ip":"192.168.1.101", - "mac":"90:e2:ba:20:1f:d9", - "namespace":"vstf-space-2" - } - }, - { - "agent":"192.168.188.14", - "dev":{ - "bdf":"04:00.0", - "iface":"eth4", - "ip":"192.168.1.100", - "mac":"90:e2:ba:20:1f:d8", - "namespace":"vstf-space-1" - } - } - ], - "senders":[ - { - "agent":"192.168.188.14", - "dev":{ - "bdf":"04:00.0", - "iface":"eth4", - "ip":"192.168.1.100", - "mac":"90:e2:ba:20:1f:d8", - "namespace":"vstf-space-1" - } - }, - { - "agent":"192.168.188.14", - "dev":{ - "bdf":"04:00.1", - "iface":"p57p2", - "ip":"192.168.1.101", - "mac":"90:e2:ba:20:1f:d9", - "namespace":"vstf-space-2" - } - } - ], - "watchers":[ - { - "agent":"192.168.188.14", - "dev":{ - "bdf":"04:00.0", - "iface":"eth4", - "ip":"192.168.1.100", - "mac":"90:e2:ba:20:1f:d8", - "namespace":"vstf-space-1" - } - }, - { - "agent":"192.168.188.14", - "dev":{ - "bdf":"04:00.1", - "iface":"p57p2", - "ip":"192.168.1.101", - "mac":"90:e2:ba:20:1f:d9", - "namespace":"vstf-space-2" - } - } - ] -} \ No newline at end of file diff --git a/testsuites/vstf/vstf_scripts/etc/vstf/perf/sw_perf.forwarding-settings b/testsuites/vstf/vstf_scripts/etc/vstf/perf/sw_perf.forwarding-settings deleted file mode 100644 index 17f66434..00000000 --- a/testsuites/vstf/vstf_scripts/etc/vstf/perf/sw_perf.forwarding-settings +++ /dev/null @@ -1,51 +0,0 @@ -{ - "head": { - "ip": "192.168.1.100", - "namespace": "vstf-space-1" - }, - - "tail": { - "ip": "192.168.1.101", - "namespace": "vstf-space-2" - }, - - "Tnv":{ - "flows":[ - ["tester", 0], - ["host", 0], - ["host", 2], - ["host", 3], - ["host", 1], - ["tester", 1] - ], - "watchers": [1, 4] - }, - "Tn":{ - "flows":[ - ["tester", 0], - ["host", 0], - ["host", 1], - ["tester", 1] - ], - "watchers": [1, 2] - }, - "Tu":{ - "flows":[ - ["vm-200", 0], - ["host", 2], - ["host", 3], - ["vm-201", 0] - - ], - "watchers": [1, 2] - }, - "Ti":{ - "flows":[ - ["tester", 1], - ["host", 0], - ["host", 2], - ["vm-200", 0] - ], - "watchers": [1, 2] - } -} \ No newline at end of file diff --git a/testsuites/vstf/vstf_scripts/etc/vstf/reporter/reporters.template-settings b/testsuites/vstf/vstf_scripts/etc/vstf/reporter/reporters.template-settings deleted file mode 100644 index f0e4a29e..00000000 --- a/testsuites/vstf/vstf_scripts/etc/vstf/reporter/reporters.template-settings +++ /dev/null @@ -1,36 +0,0 @@ -{ - "theme":{ - "style": "default", - "title": ["Virtual Switch Test Framework Report", "Scenario Tn"], - "logo": ["/root/workspace/esp-atf-2/vstf/controller/res/logo.jpg"], - "header": [""], - "footer": [""], - "note": [""] - }, - "contents":{ - "enable": true - }, - "context":{ - "01##chapter#1": { - "01##title#1": ["System Environment"], - "02##table#1": None - }, - "02##chapter#2": { - "01##title#1": ["Scenario Result"], - "02##section#1": { - "01##title#2": ["Case: Tn-1"], - "02##paragraph#2": ["Parameter"], - "03##paragraph#2": ["test tool: pktgen", "vswitch: ovs", "protocol: udp", "type: frameloss" ], - "04##paragraph#2": ["Result"], - "05##table#1":[ - ["FrameSize (bytes)", "Bandwidth(Mpps)", "Load(%)", "CPU Usage(%)", "Mpps/Ghz"], - ["64", "", "", "", "", ""] - ], - "06##plot#1":[ - ["64", "", "", "", "", ""] - ] - } - } - - } -} diff --git a/testsuites/vstf/vstf_scripts/etc/vstf/spirent/optimize.ini b/testsuites/vstf/vstf_scripts/etc/vstf/spirent/optimize.ini deleted file mode 100644 index 23fefea7..00000000 --- a/testsuites/vstf/vstf_scripts/etc/vstf/spirent/optimize.ini +++ /dev/null @@ -1,14 +0,0 @@ -[common] -tester_ip = 9.31.1.215 -[send] -nic=enp129s0f1 -port=2/5 -vlans=100 300 500 700 -macs = 68:05:CA:30:4F:01 68:05:CA:30:4F:02 68:05:CA:30:4F:03 68:05:CA:30:4F:04 -ip_sections=193.168.100.1 194.168.100.1 195.168.100.1 196.168.100.1 -[recv] -nic=enp129s0f0 -port=2/9 -macs = 68:05:CA:30:4F:05 68:05:CA:30:4F:06 68:05:CA:30:4F:07 68:05:CA:30:4F:08 -vlans=200 400 600 800 -ip_sections=193.168.100.2 194.168.100.2 195.168.100.2 196.168.100.2 diff --git a/testsuites/vstf/vstf_scripts/etc/vstf/spirent/strategy.ini b/testsuites/vstf/vstf_scripts/etc/vstf/spirent/strategy.ini deleted file mode 100644 index 08731505..00000000 --- a/testsuites/vstf/vstf_scripts/etc/vstf/spirent/strategy.ini +++ /dev/null @@ -1,21 +0,0 @@ -[strategy1] -qemu_numa=1 -src_vhost_numa=1 -dst_vhost_numa=1 -src_irq_numa=1 -dst_irq_numa=1 -loan_numa=0 -[strategy2] -qemu_numa=0 -src_vhost_numa=0 -dst_vhost_numa=0 -src_irq_numa=0 -dst_irq_numa=0 -loan_numa=1 -[strategy3] -qemu_numa=1 -src_vhost_numa=0 -dst_vhost_numa=0 -src_irq_numa=0 -dst_irq_numa=0 -loan_numa=1 diff --git a/testsuites/vstf/vstf_scripts/etc/vstf/user/reporters.html-settings b/testsuites/vstf/vstf_scripts/etc/vstf/user/reporters.html-settings deleted file mode 100644 index deaa69b8..00000000 --- a/testsuites/vstf/vstf_scripts/etc/vstf/user/reporters.html-settings +++ /dev/null @@ -1,3 +0,0 @@ -{ - -} diff --git a/testsuites/vstf/vstf_scripts/etc/vstf/user/reporters.mail.mail-settings b/testsuites/vstf/vstf_scripts/etc/vstf/user/reporters.mail.mail-settings deleted file mode 100644 index e5c7b44f..00000000 --- a/testsuites/vstf/vstf_scripts/etc/vstf/user/reporters.mail.mail-settings +++ /dev/null @@ -1,15 +0,0 @@ -{ - "server": { - "host": "localhost", - "username": null, - "password": null - }, - "body": { - "from": [ - ], - "to": [ - ], - "cc": [], - "bcc": [] - } -} diff --git a/testsuites/vstf/vstf_scripts/etc/vstf/user/sw_perf.tool-settings b/testsuites/vstf/vstf_scripts/etc/vstf/user/sw_perf.tool-settings deleted file mode 100644 index 2c63c085..00000000 --- a/testsuites/vstf/vstf_scripts/etc/vstf/user/sw_perf.tool-settings +++ /dev/null @@ -1,2 +0,0 @@ -{ -} diff --git a/testsuites/vstf/vstf_scripts/install.sh b/testsuites/vstf/vstf_scripts/install.sh deleted file mode 100644 index 4a63a1e1..00000000 --- a/testsuites/vstf/vstf_scripts/install.sh +++ /dev/null @@ -1,51 +0,0 @@ -#!/bin/bash -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -SERVER=$2 -PORT=$3 -if [ -e $SERVER ] -then - SERVER="" - echo "Use Default server." -fi - -if [ -e $PORT ] -then - PORT="" - echo "Use Default port." -fi - - -killall vnstat -killall netserver -killall netperf -killall sar -rm -rf vstf.egg-info || exit 1 -rm -rf build/ || exit 1 -rm -rf /usr/local/lib/python2.7/dist-packages/vstf* || exit 1 -python setup.py install --force -if [ $1 == "manager" ]; then - vstf-agent stop - vstf-manager stop - if [ "${SERVER}x" == "x" ] - then - vstf-manager start - else - if [ "${PORT}x" == "x" ]; then - vstf-manager start --monitor ${SERVER} - else - vstf-manager start --monitor ${SERVER} --port ${PORT} - fi - fi -elif [ $1 == "agent" ];then - vstf-manager stop - vstf-agent stop - vstf-agent start --config_file=/etc/vstf/amqp/amqp.ini -fi diff --git a/testsuites/vstf/vstf_scripts/pylint.conf b/testsuites/vstf/vstf_scripts/pylint.conf deleted file mode 100644 index 6514d3c6..00000000 --- a/testsuites/vstf/vstf_scripts/pylint.conf +++ /dev/null @@ -1,280 +0,0 @@ -[MASTER] - -# Specify a configuration file. -#rcfile= - -# Python code to execute, usually for sys.path manipulation such as -# pygtk.require(). -#init-hook= - -# Profiled execution. -profile=no - -# Add files or directories to the blacklist. They should be base names, not -# paths. -ignore=CVS - -# Pickle collected data for later comparisons. -persistent=yes - -# List of plugins (as comma separated values of python modules names) to load, -# usually to register additional checkers. -load-plugins= - - -[MESSAGES CONTROL] - -# Enable the message, report, category or checker with the given id(s). You can -# either give multiple identifier separated by comma (,) or put this option -# multiple time. See also the "--disable" option for examples. -#enable= - -# Disable the message, report, category or checker with the given id(s). You -# can either give multiple identifiers separated by comma (,) or put this -# option multiple times (only on the command line, not in the configuration -# file where it should appear only once).You can also use "--disable=all" to -# disable everything first and then reenable specific checks. For example, if -# you want to run only the similarities checker, you can use "--disable=all -# --enable=similarities". If you want to run only the classes checker, but have -# no Warning level messages displayed, use"--disable=all --enable=classes -# --disable=W" -#disable= - - -[REPORTS] - -# Set the output format. Available formats are text, parseable, colorized, msvs -# (visual studio) and html. You can also give a reporter class, eg -# mypackage.mymodule.MyReporterClass. -output-format=text - -# Put messages in a separate file for each module / package specified on the -# command line instead of printing them on stdout. Reports (if any) will be -# written in a file name "pylint_global.[txt|html]". -files-output=no - -# Tells whether to display a full report or only the messages -reports=no - -# Python expression which should return a note less than 10 (10 is the highest -# note). You have access to the variables errors warning, statement which -# respectively contain the number of errors / warnings messages and the total -# number of statements analyzed. This is used by the global evaluation report -# (RP0004). -evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) - -# Add a comment according to your evaluation note. This is used by the global -# evaluation report (RP0004). -comment=no - -# Template used to display messages. This is a python new-style format string -# used to format the message information. See doc for all details -#msg-template= - - -[FORMAT] - -# Maximum number of characters on a single line. -max-line-length=80 - -# Regexp for a line that is allowed to be longer than the limit. -ignore-long-lines=^\s*(# )??$ - -# Allow the body of an if to be on the same line as the test if there is no -# else. -single-line-if-stmt=no - -# List of optional constructs for which whitespace checking is disabled -no-space-check=trailing-comma,dict-separator - -# Maximum number of lines in a module -max-module-lines=1000 - -# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 -# tab). -indent-string=' ' - - -[MISCELLANEOUS] - -# List of note tags to take in consideration, separated by a comma. -notes=FIXME,XXX,TODO - - -[TYPECHECK] - -# Tells whether missing members accessed in mixin class should be ignored. A -# mixin class is detected if its name ends with "mixin" (case insensitive). -ignore-mixin-members=yes - -# List of classes names for which member attributes should not be checked -# (useful for classes with attributes dynamically set). -ignored-classes=SQLObject - -# When zope mode is activated, add a predefined set of Zope acquired attributes -# to generated-members. -zope=no - -# List of members which are set dynamically and missed by pylint inference -# system, and so shouldn't trigger E0201 when accessed. Python regular -# expressions are accepted. -generated-members=REQUEST,acl_users,aq_parent - - -[SIMILARITIES] - -# Minimum lines number of a similarity. -min-similarity-lines=4 - -# Ignore comments when computing similarities. -ignore-comments=yes - -# Ignore docstrings when computing similarities. -ignore-docstrings=yes - -# Ignore imports when computing similarities. -ignore-imports=no - - -[BASIC] - -# Required attributes for module, separated by a comma -required-attributes= - -# List of builtins function names that should not be used, separated by a comma -bad-functions=map,filter,apply,input - -# Regular expression which should only match correct module names -module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ - -# Regular expression which should only match correct module level names -const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__))$ - -# Regular expression which should only match correct class names -class-rgx=[A-Z_][a-zA-Z0-9]+$ - -# Regular expression which should only match correct function names -function-rgx=[a-z_][a-z0-9_]{2,30}$ - -# Regular expression which should only match correct method names -method-rgx=[a-z_][a-z0-9_]{2,30}$ - -# Regular expression which should only match correct instance attribute names -attr-rgx=[a-z_][a-z0-9_]{2,30}$ - -# Regular expression which should only match correct argument names -argument-rgx=[a-z_][a-z0-9_]{2,30}$ - -# Regular expression which should only match correct variable names -variable-rgx=[a-z_][a-z0-9_]{2,30}$ - -# Regular expression which should only match correct attribute names in class -# bodies -class-attribute-rgx=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$ - -# Regular expression which should only match correct list comprehension / -# generator expression variable names -inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$ - -# Good variable names which should always be accepted, separated by a comma -good-names=i,j,k,ex,Run,_ - -# Bad variable names which should always be refused, separated by a comma -bad-names=foo,bar,baz,toto,tutu,tata - -# Regular expression which should only match function or class names that do -# not require a docstring. -no-docstring-rgx=__.*__ - -# Minimum line length for functions/classes that require docstrings, shorter -# ones are exempt. -docstring-min-length=-1 - - -[VARIABLES] - -# Tells whether we should check for unused import in __init__ files. -init-import=no - -# A regular expression matching the beginning of the name of dummy variables -# (i.e. not used). -dummy-variables-rgx=_$|dummy - -# List of additional names supposed to be defined in builtins. Remember that -# you should avoid to define new builtins when possible. -additional-builtins= - - -[DESIGN] - -# Maximum number of arguments for function / method -max-args=5 - -# Argument names that match this expression will be ignored. Default to name -# with leading underscore -ignored-argument-names=_.* - -# Maximum number of locals for function / method body -max-locals=15 - -# Maximum number of return / yield for function / method body -max-returns=6 - -# Maximum number of branch for function / method body -max-branches=12 - -# Maximum number of statements in function / method body -max-statements=50 - -# Maximum number of parents for a class (see R0901). -max-parents=7 - -# Maximum number of attributes for a class (see R0902). -max-attributes=7 - -# Minimum number of public methods for a class (see R0903). -min-public-methods=2 - -# Maximum number of public methods for a class (see R0904). -max-public-methods=20 - - -[CLASSES] - -# List of interface methods to ignore, separated by a comma. This is used for -# instance to not check methods defines in Zope's Interface base class. -ignore-iface-methods=isImplementedBy,deferred,extends,names,namesAndDescriptions,queryDescriptionFor,getBases,getDescriptionFor,getDoc,getName,getTaggedValue,getTaggedValueTags,isEqualOrExtendedBy,setTaggedValue,isImplementedByInstancesOf,adaptWith,is_implemented_by - -# List of method names used to declare (i.e. assign) instance attributes. -defining-attr-methods=__init__,__new__,setUp - -# List of valid names for the first argument in a class method. -valid-classmethod-first-arg=cls - -# List of valid names for the first argument in a metaclass class method. -valid-metaclass-classmethod-first-arg=mcs - - -[IMPORTS] - -# Deprecated modules which should not be used, separated by a comma -deprecated-modules=regsub,TERMIOS,Bastion,rexec - -# Create a graph of every (i.e. internal and external) dependencies in the -# given file (report RP0402 must not be disabled) -import-graph= - -# Create a graph of external dependencies in the given file (report RP0402 must -# not be disabled) -ext-import-graph= - -# Create a graph of internal dependencies in the given file (report RP0402 must -# not be disabled) -int-import-graph= - - -[EXCEPTIONS] - -# Exceptions that will emit a warning when being caught. Defaults to -# "Exception" -overgeneral-exceptions=Exception diff --git a/testsuites/vstf/vstf_scripts/requirements.txt b/testsuites/vstf/vstf_scripts/requirements.txt deleted file mode 100644 index 3d7e8037..00000000 --- a/testsuites/vstf/vstf_scripts/requirements.txt +++ /dev/null @@ -1,13 +0,0 @@ -# The order of packages is significant, because pip processes them in the order -# of appearance. Changing the order has an impact on the overall integration -# process, which may cause wedges in the gate later. -pbr>=0.6,!=0.7,<1.0 -pika -clize -sqlalchemy -stevedore -paramiko -reportlab -sigtools -six>=1.7.0,<=1.9.0 -oslo.config>=1.4.0,<=1.6.0 # Apache-2.0 diff --git a/testsuites/vstf/vstf_scripts/setup.cfg b/testsuites/vstf/vstf_scripts/setup.cfg deleted file mode 100644 index 923f9f7a..00000000 --- a/testsuites/vstf/vstf_scripts/setup.cfg +++ /dev/null @@ -1,77 +0,0 @@ -[metadata] -name = vstf -version = 2015.12 -summary = Virtual Switch Test Framework -description-file = - README.rst -author = BottleneckGroup -home-page = https://wiki.opnfv.org/bottlenecks -classifier = - Environment :: VSTF - Intended Audience :: Information Technology - Intended Audience :: System Administrators - License :: OSI Approved :: Apache Software License - Operating System :: POSIX :: Linux - Programming Language :: Python - Programming Language :: Python :: 2 - Programming Language :: Python :: 2.7 - Programming Language :: Python :: 2.6 - -[files] -packages = - vstf -data_files = - etc/vstf/= - etc/vstf/amqp= - etc/vstf/amqp/amqp.ini -[global] -setup-hooks = - pbr.hooks.setup_hook - -[entry_points] -console_scripts = - vstf-manager = vstf.controller.api_server:main - vstf-agent = vstf.agent.agent:main - vstfadm = vstf.controller.vstfadm:main - vstf-settings = vstf.controller.settings.settings_input:main - -agent.plugins = - soft = vstf.agent.softagent:softAgent - spirent = vstf.agent.spirentagent:spirentAgent - - -spirent.model.plugins = - Tnv = vstf.spirent.common.model:Tnv_Model - -perf.plugins = - spirent = vstf.controller.spirent.appliance:spirentSTC - -vswitch.plugins = - ovs = vstf.agent.env.vswitch_plugins.ovs_plugin:OvsPlugin - bridge = vstf.agent.env.vswitch_plugins.bridge_plugin:BridgePlugin - -drivers.plugins = - origin = vstf.agent.env.driver_plugins.origin_driver:OriginDriverPlugin - -env_build.plugins = - libvirt = vstf.agent.env.plugins.libvirt_plugin:Plugin - transmitter = vstf.agent.env.plugins.tester_env_plugin:Plugin -[build_sphinx] -#all_files = 1 -#build-dir = doc/build -#source-dir = doc/source - -[extract_messages] - -[compile_catalog] - -[update_catalog] - -[wheel] -universal = 1 - -[egg_info] -tag_build = -tag_date = 0 -tag_svn_revision = 0 - diff --git a/testsuites/vstf/vstf_scripts/setup.py b/testsuites/vstf/vstf_scripts/setup.py deleted file mode 100644 index bdecb375..00000000 --- a/testsuites/vstf/vstf_scripts/setup.py +++ /dev/null @@ -1,23 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -# THIS FILE IS MANAGED BY THE GLOBAL REQUIREMENTS REPO - DO NOT EDIT -import setuptools - -# In python < 2.7.4, a lazy loading of package `pbr` will break -# setuptools if some other modules registered functions in `atexit`. -# solution from: http://bugs.python.org/issue15881#msg170215 -try: - import multiprocessing # noqa -except ImportError: - pass - -setuptools.setup( - setup_requires=['pbr'], - pbr=True) diff --git a/testsuites/vstf/vstf_scripts/vstf/__init__.py b/testsuites/vstf/vstf_scripts/vstf/__init__.py deleted file mode 100644 index 83b8d15d..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/__init__.py b/testsuites/vstf/vstf_scripts/vstf/agent/__init__.py deleted file mode 100644 index 83b8d15d..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/agent/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/agent.py b/testsuites/vstf/vstf_scripts/vstf/agent/agent.py deleted file mode 100644 index 4d92c510..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/agent/agent.py +++ /dev/null @@ -1,144 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -# !/usr/bin/env python -# coding=utf-8 - -import logging -import argparse -import signal - -from oslo.config import cfg - -from vstf.rpc_frame_work import rpc_consumer -from vstf.common.log import setup_logging -from vstf.common import daemon -from vstf.common.cfgparser import CfgParser - -LOG = logging.getLogger(__name__) - -server_opts = [ - cfg.StrOpt('user', default='guest', help="the rabbit's user, default guest"), - cfg.StrOpt('passwd', default='guest', help="the rabbit's passwd, default guest"), - cfg.StrOpt('host', default='localhost', help="tell the process wich interface to listen"), - cfg.StrOpt('port', default=5672, help=""), - cfg.StrOpt('id', default='agent', help="") - -] - -stc_opts = [ - cfg.StrOpt('package', default='', help="the STC python path") -] - - -class Client(daemon.Daemon): - """This is a consumer of vstf-agent which will create two channel to the - rabbitmq-server, one for direct call, one for fan call. - - agent start with a config file which record rabbitmq's ip, port and user passwd - also each agent has its own id. - - """ - - def __init__(self, agent, config_file): - """Record the config file, init the daemon. - - :param str config_file: the config of a VSTF agent. - - """ - super(Client, self).__init__('/tmp/esp_rpc_client.pid') - self.config_file = config_file - self.agent = agent - self.config = None - self.proxy = None - self.run_flag = True - - def init_config(self): - """Use olso.config to analyse the config file - - """ - parser = CfgParser(self.config_file) - parser.register_my_opts(server_opts, "rabbit") - parser.register_my_opts(stc_opts, "spirent") - self.config = parser.parse() - - def loop_thread(self): - LOG.info("Try to create direct proxy...") - self.proxy = rpc_consumer.VstfConsumer(self.agent, - self.config.rabbit.user, - self.config.rabbit.passwd, - self.config.rabbit.host, - self.config.rabbit.port, - self.config.rabbit.id) - self.proxy.run() - - def run(self): - """Run the rabbitmq consumers as a daemon. - - """ - signal.signal(signal.SIGTERM, self.process_exit) - self.loop_thread() - LOG.info("agent start ok!") - - def process_exit(self, signum, frame): - """This function try to stop the agent after running agent stop. - When we call vstf-agent stop which will send a signal SIGTERM to agent - When the agent catch the SIGTERM signal will call this function. - - """ - LOG.info("daemon catch the signalterm, start to stop the process.") - self.run_flag = False - if self.proxy: - self.proxy.stop() - - def start_agent(self): - self.init_config() - self.start() - - def stop_agent(self): - """Notice that: this function just kill the agent by pid file, it has - none vars of the agent. - - """ - LOG.info("call daemon stop.") - # kill the main thread - self.stop() - - -def main(): - setup_logging(level=logging.INFO, log_file="/var/log/vstf/vstf-agent.log") - parser = argparse.ArgumentParser(description='agent option') - parser.add_argument('action', choices=('start', 'stop', "restart"), - default="start", help="start or stop agent") - parser.add_argument('--agent_type', action='store', - default="soft", - choices=["soft", "spirent"], - help="the agent type, as now, just soft and spirent") - parser.add_argument( - '--config_file', - action='store', - default="/etc/vstf/amqp/amqp.ini", - help="some env_build params recorded in the config file") - - args = parser.parse_args() - - client = Client(args.agent_type, args.config_file) - if "start" == args.action: - client.start_agent() - elif "stop" == args.action: - client.stop_agent() - elif "restart" == args.action: - client.stop_agent() - client.start_agent() - else: - raise Exception("only support actions: start/stop/restart") - - -if __name__ == '__main__': - main() diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/env/__init__.py b/testsuites/vstf/vstf_scripts/vstf/agent/env/__init__.py deleted file mode 100644 index 83b8d15d..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/agent/env/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/env/basic/__init__.py b/testsuites/vstf/vstf_scripts/vstf/agent/env/basic/__init__.py deleted file mode 100644 index 83b8d15d..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/agent/env/basic/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/env/basic/collect.py b/testsuites/vstf/vstf_scripts/vstf/agent/env/basic/collect.py deleted file mode 100644 index 1d39d7b7..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/agent/env/basic/collect.py +++ /dev/null @@ -1,112 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -import os -import platform -import logging -from collections import OrderedDict - -from vstf.agent.env.basic.commandline import CommandLine -from vstf.common import constants as const - -log = logging.getLogger(__name__) -CMD = CommandLine() - - -class Collect(object): - """collect host information such as _cpu, memory and so on""" - - def __init__(self): - super(Collect, self).__init__() - self._system = self._system() - self._cpu = self._cpu() - - def _system(self): - """the base _system info - {'os info':{'_system':'ubuntu', 'kernel': '3.13.3'}}""" - return {const.OS_INFO: - { - '_system': open('/etc/issue.net').readline().strip(), - 'kernel': platform.uname()[2] - } - } - - def _memery(self): - """ Return the information in /proc/meminfo - as a dictionary """ - meminfo = OrderedDict() - with open('/proc/meminfo') as f: - for line in f: - meminfo[line.split(':')[0]] = line.split(':')[1].strip() - - return {const.MEMORY_INFO: - { - "Mem Total": meminfo['MemTotal'], - "Mem Swap": meminfo['SwapTotal'] - } - } - - def _lscpu(self): - ret = {} - with os.popen("lscpu") as f: - for line in f: - ret[line.split(':')[0].strip()] = line.split(':')[1].strip() - return ret - - def _cpu(self): - ret = [] - with open('/proc/cpuinfo') as f: - cpuinfo = OrderedDict() - for line in f: - if not line.strip(): - ret.append(cpuinfo) - cpuinfo = OrderedDict() - elif len(line.split(':')) == 2: - cpuinfo[line.split(':')[0].strip()] = line.split(':')[ - 1].strip() - else: - log.error("_cpu info unknow format <%(c)s>", {'c': line}) - return {const.CPU_INFO: - dict( - { - "Model Name": ret[0]['model name'], - "Address sizes": ret[0]['address sizes'] - }, - **(self._lscpu()) - ) - } - - def _hw_sysinfo(self): - cmdline = "dmidecode | grep -A 2 'System Information' | grep -v 'System Information'" - ret, output = CMD.execute(cmdline, shell=True) - if ret: - result = {} - # del the stderr - for tmp in output.strip().split('\n'): - if tmp is None or tmp is "": - continue - # split the items - tmp = tmp.split(":") - if len(tmp) >= 2: - # first item as key, and the other as value - result[tmp[0].strip("\t")] = ";".join(tmp[1:]) - return {const.HW_INFO: result} - else: - return { - const.HW_INFO: "get hw info failed. check the host by cmd: dmidecode"} - - def collect_host_info(self): - return [self._system, self._cpu, self._memery(), self._hw_sysinfo()] - - -if __name__ == "__main__": - c = Collect() - import json - - print json.dumps(c.collect_host_info(), indent=4) diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/env/basic/commandline.py b/testsuites/vstf/vstf_scripts/vstf/agent/env/basic/commandline.py deleted file mode 100644 index 29dd2c02..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/agent/env/basic/commandline.py +++ /dev/null @@ -1,56 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -import subprocess -import threading -import logging -from vstf.common import constants - -LOG = logging.getLogger(__name__) - - -class CommandLine(object): - - def __init__(self): - super(CommandLine, self).__init__() - self.proc = None - self.is_timeout = False - - def __kill_proc(self): - self.is_timeout = True - self.proc.kill() - - def execute(self, cmd, timeout=constants.TIMEOUT, shell=False): - """this func call subprocess.Popen(), - here setup a timer to deal with timeout. - :param cmd: cmd list like ['ls', 'home'] - :param timeout: for timer count for timeout - :return: (ret, output) the output (stdout+'\n'+stderr) - """ - # reset the timeout flag - self.is_timeout = False - self.proc = subprocess.Popen(cmd, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - shell=shell) - - timer = threading.Timer(timeout, self.__kill_proc, []) - timer.start() - stdout, stderr = self.proc.communicate() - timer.cancel() - - if self.proc.returncode or self.is_timeout: - if self.is_timeout: - LOG.error("run cmd<%(cmd)s> timeout", {"cmd": cmd}) - ret = False - output = "".join([stderr, stdout]) - else: - ret = True - output = stdout - return ret, output diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/env/basic/device_manager.py b/testsuites/vstf/vstf_scripts/vstf/agent/env/basic/device_manager.py deleted file mode 100644 index c34f5e06..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/agent/env/basic/device_manager.py +++ /dev/null @@ -1,154 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -import re -import logging -from vstf.agent.perf import netns -from vstf.common.utils import check_output, get_device_name, my_sleep, check_call, call, IPCommandHelper - -LOG = logging.getLogger(__name__) - -default_drivers = { - '82599': 'ixgbe', - '82576': 'igb', -} - - -class LspciHelper(object): - - def __init__(self): - self.bdf_desc_map = {} - self.bdf_device_map = {} - self.device_bdf_map = {} - self.bdf_ip_map = {} - self.bdf_driver_map = {} - self.mac_bdf_map = {} - self.bdf_mac_map = {} - self._get_bdfs() - self._get_devices() - self._get_drivers() - self._get_ip_macs() - - def _get_bdfs(self): - self.bdf_desc_map = {} - out = check_output('lspci |grep Eth', shell=True) - for line in out.splitlines(): - bdf, desc = line.split(' ', 1) - self.bdf_desc_map[bdf] = desc - - def _get_devices(self): - for bdf, desc in self.bdf_desc_map.items(): - device = get_device_name(bdf) - if device is None: - LOG.info( - "cann't find device name for bdf:%s, no driver is available.", bdf) - try: - self._load_driver(desc) - except: - LOG.warn("!!!unable to load_driver for device:%s", bdf) - my_sleep(0.2) - device = get_device_name(bdf) - self.bdf_device_map[bdf] = device - if device: - self.device_bdf_map[device] = bdf - check_call("ip link set dev %s up" % device, shell=True) - - def _get_drivers(self): - for device, bdf in self.device_bdf_map.items(): - buf = check_output('ethtool -i %s | head -n1' % device, shell=True) - driver = buf.split()[1] - self.bdf_driver_map[bdf] = driver - - def _get_ip_macs(self): - for device, bdf in self.device_bdf_map.items(): - buf = check_output("ip addr show dev %s" % device, shell=True) - macs = re.compile( - "[A-F0-9]{2}(?::[A-F0-9]{2}){5}", - re.IGNORECASE | re.MULTILINE) - for mac in macs.findall(buf): - if mac.lower() in ('00:00:00:00:00:00', 'ff:ff:ff:ff:ff:ff'): - continue - else: - break - ips = re.compile( - r"inet (\d{1,3}\.\d{1,3}\.\d{1,3}.\d{1,3}/\d{1,2})", - re.MULTILINE) - ip = ips.findall(buf) - if ip: - self.bdf_ip_map[bdf] = ip[0] - else: - self.bdf_ip_map[bdf] = None - self.bdf_mac_map[bdf] = mac - self.mac_bdf_map[mac] = bdf - - def _load_driver(self, desc): - for key in default_drivers: - if key in desc: - driver = default_drivers[key] - LOG.info("try to load default driver [%s]", driver) - check_call('modprobe %s' % driver, shell=True) - break - else: - LOG.warn("unsupported nic type:%s", desc) - - -class DeviceManager(object): - - def __init__(self): - super(DeviceManager, self).__init__() - mgr = netns.NetnsManager() - mgr.clean_all_namespace() - self.lspci_helper = LspciHelper() - - def _get_device_detail(self, bdf): - device = self.lspci_helper.bdf_device_map[bdf] - mac = self.lspci_helper.bdf_mac_map[bdf] - ip = self.lspci_helper.bdf_ip_map[bdf] - desc = self.lspci_helper.bdf_desc_map[bdf] - driver = self.lspci_helper.bdf_driver_map[bdf] - detail = { - 'bdf': bdf, - 'device': device, - 'mac': mac, - 'ip': ip, - 'desc': desc, - 'driver': driver - } - return detail - - def get_device_detail(self, identity): - """ - Gets the detail of a network card. - - :param identity: be it the mac address, bdf, device name of a network card. - :return: device detail of a network card. - """ - if identity in self.lspci_helper.bdf_device_map: - bdf = identity - elif identity in self.lspci_helper.device_bdf_map: - bdf = self.lspci_helper.device_bdf_map[identity] - elif identity in self.lspci_helper.mac_bdf_map: - bdf = self.lspci_helper.mac_bdf_map[identity] - else: - raise Exception("cann't find the device by identity:%s" % identity) - return self._get_device_detail(bdf) - - def get_device_verbose(self, identity): - return IPCommandHelper().get_device_verbose(identity) - - def list_nic_devices(self): - """ - Get all the details of network devices in the host. - :return: a list of network card detail. - """ - device_list = [] - for bdf in self.lspci_helper.bdf_device_map.keys(): - detail = self._get_device_detail(bdf) - device_list.append(detail) - return device_list diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/env/basic/image_manager.py b/testsuites/vstf/vstf_scripts/vstf/agent/env/basic/image_manager.py deleted file mode 100644 index 4bae49d2..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/agent/env/basic/image_manager.py +++ /dev/null @@ -1,156 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -from vstf.common.utils import check_call -import os -import logging - -LOG = logging.getLogger(__name__) - - -class _ImageManager(object): - """ - A qemu-img wrapper to create qcow2 child image from a parent image. - - """ - - def __init__(self, parent_image_path, child_image_dir): - """ - :param parent_image_path str: the parent image path. - :param child_image_dir str: the destination path to put child images. - """ - self._create_child_str = 'qemu-img create -f %(image_type)s %(child_path)s -o backing_file=%(parent_path)s' - self._convert_str = "qemu-img convert -O %(image_type)s %(parent_path)s %(child_path)s" - self.child_image_dir = child_image_dir - self.parent_image_path = parent_image_path - assert os.path.isfile(self.parent_image_path) - assert os.path.isdir(self.child_image_dir) - - def create_child_image( - self, - child_name, - full_clone=False, - image_type='qcow2'): - """ - create a child image and put it in self.child_image_dir. - - :param child_name: the image name to be created.. - :return: return the path of child image. - """ - - image_path = os.path.join( - self.child_image_dir, - child_name) + '.' + image_type - if full_clone: - cmd = self._convert_str % { - 'image_type': image_type, - 'child_path': image_path, - 'parent_path': self.parent_image_path} - else: - cmd = self._create_child_str % { - 'child_path': image_path, - 'parent_path': self.parent_image_path, - 'image_type': image_type} - check_call(cmd.split()) - return image_path - - -class ImageManager(object): - - def __init__(self, cfg): - """ - ImageManager creates images from configuration context. - - :param cfg: dict, example: - { - 'parent_image': "/mnt/sdb/ubuntu_salt_master.img", - 'dst_location': "/mnt/sdb", - 'full_clone':False, - 'type': "qcow2", - 'names': ['vm1','vm2','vm3','vm4'] - } - :return: - """ - super(ImageManager, self).__init__() - cfg = self._check_cfg(cfg) - self.parent_image = cfg['parent_image'] - self.image_dir = cfg['dst_location'] - self.full_clone = cfg['full_clone'] - self.image_type = cfg['type'] - self.names = cfg['names'] - self.mgr = _ImageManager(self.parent_image, self.image_dir) - - @staticmethod - def _check_cfg(cfg): - for key in ( - 'parent_image', - 'dst_location', - 'full_clone', - 'type', - 'names'): - if key not in cfg: - raise Exception("does't find %s config" % key) - if cfg['type'] not in ('raw', 'qcow2'): - raise Exception( - "type:%s not supported, only support 'raw' and 'qcow2'" % - cfg['type']) - if not cfg['full_clone'] and cfg['type'] == 'raw': - raise Exception( - "only support 'qcow2' for not full_clone image creation" % - cfg['type']) - return cfg - - def create_all(self): - """ - create images by configuration context. - - :return: True for success, False for failure. - """ - for name in self.names: - image = self.mgr.create_child_image( - name, self.full_clone, self.image_type) - LOG.info("image: %s created", image) - return True - - def clean_all(self): - """ - remove all the images created in one go. - - :return: True for success. Raise exception otherwise. - """ - for name in self.names: - image_path = os.path.join( - self.image_dir, name + '.' + self.image_type) - try: - os.unlink(image_path) - LOG.info("remove:%s successfully", image_path) - except Exception: - LOG.info("cann't find path:%s", image_path) - return True - - -if __name__ == '__main__': - import argparse - import json - parser = argparse.ArgumentParser() - parser.add_argument( - 'action', - choices=( - 'create', - 'clean'), - help='action:create|clean') - parser.add_argument('--config', help='config file to parse') - args = parser.parse_args() - logging.basicConfig(level=logging.INFO) - image_cfg = json.load(open(args.config)) - mgr = ImageManager(image_cfg) - if args.action == 'create': - mgr.create_all() - if args.action == 'clean': - mgr.clean_all() diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/env/basic/source_manager.py b/testsuites/vstf/vstf_scripts/vstf/agent/env/basic/source_manager.py deleted file mode 100644 index 5aca5368..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/agent/env/basic/source_manager.py +++ /dev/null @@ -1,79 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -import os -import logging -import contextlib -from subprocess import CalledProcessError -from vstf.common.utils import check_call - -LOG = logging.getLogger(__name__) - - -@contextlib.contextmanager -def my_chdir(file_path): - old_cwd = os.path.realpath(os.curdir) - os.chdir(file_path) - LOG.info("cd %s", file_path) - yield - os.chdir(old_cwd) - LOG.info("cd %s", old_cwd) - - -class SourceCodeManager(object): - - def __init__(self): - super(SourceCodeManager, self).__init__() - self.base_path = '/opt/vstf/' - - @staticmethod - def _git_pull(url, dest): - if not os.path.isdir(dest): - check_call("git clone %s %s" % (url, dest), shell=True) - else: - with my_chdir(dest): - check_call("git pull", shell=True) - - @staticmethod - def _install(dest): - with my_chdir(dest): - try: - check_call("make && make install", shell=True) - except CalledProcessError: - LOG.info("retry make again") - check_call("make clean; make && make install", shell=True) - - def src_install(self, cfg): - for key, item in cfg.items(): - repo_type = item['repo_type'] - url = item['url'] - install = item['install'] - if install is True: - LOG.info("installing src repo:%s", key) - if repo_type == "git": - target = self.base_path + key - self._git_pull(url, target) - self._install(target) - else: - raise Exception("unsupported repo type:%s" % repo_type) - else: - LOG.info("skip src repo:%s", key) - return True - - -if __name__ == '__main__': - import argparse - import json - parser = argparse.ArgumentParser() - parser.add_argument('--config', help='config file to parse') - args = parser.parse_args() - logging.basicConfig(level=logging.INFO) - cfg = json.load(open(args.config)) - mgr = SourceCodeManager() - mgr.src_install(cfg) diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/env/basic/vm9pfs.py b/testsuites/vstf/vstf_scripts/vstf/agent/env/basic/vm9pfs.py deleted file mode 100644 index 4b7b31b1..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/agent/env/basic/vm9pfs.py +++ /dev/null @@ -1,167 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -import os -import logging -import textwrap -from vstf.common.utils import my_sleep -from vstf.agent.env.fsmonitor import constant - -LOG = logging.getLogger(__name__) - - -class VMConfigBy9pfs(object): - """ - host side implemetation of a self-defined communication protocol using libvirt 9pfs to give commands to the Virtual Machine. - - """ - - def __init__(self, vm_9p_path): - """ - :param vm_9p_path: The host path of libvirt 9pfs for a vm. - :return: - """ - self.vm_9p_path = vm_9p_path - - def clean(self): - self._unlink(self._path(constant.VM_CMD_RETURN_CODE_FILE)) - self._unlink(self._path(constant.VM_CMD_DONE_FLAG_FILE)) - - def _path(self, relative_path): - return os.path.join(self.vm_9p_path, relative_path) - - def _unlink(self, file_path): - os.unlink(file_path) - LOG.info("os.unlink(%s)", file_path) - - def _read(self, filename): - filepath = self._path(filename) - with open(filepath, 'r') as f: - ret = f.read() - LOG.info("read(%s) -> %s", filepath, ret) - return ret - - def _write(self, filename, cmd): - filepath = self._path(filename) - with open(filepath, 'w') as f: - f.write("%s" % cmd) - LOG.info("write(%s) <- %s", filepath, cmd) - - def _wait_flag_file_to_exist(self, filename, timeout): - filepath = self._path(filename) - while timeout > 0: - if os.path.exists(filepath): - LOG.info("wait and find file:%s", filepath) - return True - my_sleep(1) - timeout -= 1 - LOG.info("waiting file to exist:%s", filepath) - return False - - def _get_cmd_return_code(self): - ret = self._read(constant.VM_CMD_RETURN_CODE_FILE) - return ret == constant.VM_CMD_EXCUTE_SUCCES_FLAG_CONTENT - - def _wait_command_done(self): - done = self._wait_flag_file_to_exist( - constant.VM_CMD_DONE_FLAG_FILE, - constant.VM_COMMON_CMD_EXCUTE_TIME_OUT) - if done: - return self._get_cmd_return_code() - else: - return 'timeout' - - def _set_cmd(self, cmd): - self._write(constant.VM_CMD_CONTENT_FILE, cmd) - self._write(constant.VM_CMD_SET_FLAG_FILE, '') - ret = self._wait_command_done() - if ret: - self.clean() - return ret - else: - raise Exception("9pfs command failure: timeout.") - - def wait_up(self): - return self._wait_flag_file_to_exist( - constant.VM_UP_Flag_FILE, constant.VM_UP_TIME_OUT) - - def config_ip(self, mac, ip): - cmd = 'config_ip %s %s' % (mac, ip) - return self._set_cmd(cmd) - - def config_gw(self, ip): - cmd = 'config_gw %s' % ip - return self._set_cmd(cmd) - - def set_pktloop_dpdk(self, macs): - """ - To connect two network devices together in the vm and loop the packets received to another. - Use dpdk testpmd to loop the packets. See FSMonitor. - - :param macs: the mac address list of network cards of the vm. - :return: True for success, Exception for Failure. - """ - mac_str = ' '.join(macs) - cmd = 'set_pktloop_dpdk ' + mac_str - return self._set_cmd(cmd) - - def recover_nic_binding(self, macs): - """ - in contrast to set_pktloop_dpdk, disconnect the looping. - :param macs: the mac address list of network cards of the vm. - :return: True for success, Exception for Failure. - """ - mac_str = ' '.join(macs) - cmd = 'recover_nic_binding ' + mac_str - return self._set_cmd(cmd) - - def config_amqp( - self, - identity, - server, - port=5672, - user="guest", - passwd="guest"): - data = { - 'server': server, - 'port': port, - 'id': identity, - 'user': user, - 'passwd': passwd - } - header = "[rabbit]" - content = ''' - user=%(user)s - passwd=%(passwd)s - host=%(server)s - port=%(port)s - id=%(id)s''' % data - file_name = "amqp.ini" - dedented_text = textwrap.dedent(content) - self._write(file_name, header + dedented_text) - cmd = 'config_amqp %s' % file_name - return self._set_cmd(cmd) - - def stop_vstf(self): - cmd = "stop_vstf" - return self._set_cmd(cmd) - - def __repr__(self): - return self.__class__.__name__ + ':' + self.vm_9p_path - - -if __name__ == '__main__': - fs = VMConfigBy9pfs('/tmp/tmp4T6p7L') - print os.listdir(os.curdir) - print fs.config_ip('56:6f:44:a5:3f:a4', '192.168.188.200/23') - print fs.config_gw('192.168.188.1') - print fs.set_pktloop_dpdk(['56:6f:44:a5:3f:a2', '56:6f:44:a5:3f:a3']) - print fs.recover_nic_binding(['56:6f:44:a5:3f:a2', '56:6f:44:a5:3f:a3']) - print fs.config_amqp('192.168.188.200', '192.168.188.10') - print os.listdir(os.curdir) diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/env/basic/vm_manager.py b/testsuites/vstf/vstf_scripts/vstf/agent/env/basic/vm_manager.py deleted file mode 100644 index d0a2060d..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/agent/env/basic/vm_manager.py +++ /dev/null @@ -1,237 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -import os -import shutil -import logging -from vstf.common.utils import check_and_kill, randomMAC, my_mkdir, check_call, check_output, my_sleep -from vstf.agent.env.basic.vm9pfs import VMConfigBy9pfs - -LOG = logging.getLogger(__name__) - - -class VMControlOperation(object): - """ - a libivrt virsh wrapper for creating virtual machine. - """ - - def __init__(self): - """ - all tmp files will be created under '/tmp/atf_vm_manager' - - """ - work_dir = '/tmp/atf_vm_manager' - shutil.rmtree(work_dir, ignore_errors=True) - my_mkdir(work_dir) - self.work_dir = work_dir - self.vnc_index = 0 - self.pci_index = 3 - self.net_index = 0 - self.vm_9p_controllers = {} - self.vm_configs = {} - self.image_mgr = None - - @staticmethod - def composite_xml(context): - """ - composit a libvirt xml configuration for creating vm from context. - - :param context: a dict containing all necessary options for creating a vm. - :return: libvirt xml configuration string - """ - from vm_xml_help import xml_head, xml_disk, xml_ovs, xml_pci, xml_9p, xml_tail, xml_ctrl_br, xml_br - xml = '' - tmp = xml_head.replace('VM_NAME', context['vm_name']) - tmp = tmp.replace('VM_MEMORY', str(context['vm_memory'])) - tmp = tmp.replace('CPU_NUM', str(context['vm_cpu'])) - xml += tmp - tmp = xml_disk.replace('IMAGE_TYPE', context['image_type']) - tmp = tmp.replace('IMAGE_PATH', context['image_path']) - xml += tmp - - if context['9p_path']: - tmp = xml_9p.replace('9P_PATH', context['9p_path']) - xml += tmp - - if context['eth_pci']: - for pci in context['eth_pci']: - bus = pci[:2] - slot = pci[3:5] - func = pci[6:7] - tmp = xml_pci.replace('BUS', bus) - tmp = tmp.replace('SLOT', slot) - tmp = tmp.replace('FUNCTION', func) - xml += tmp - - if context['ctrl_br']: - tmp = xml_ctrl_br.replace('CTRL_BR', context['ctrl_br']) - tmp = tmp.replace('CTRL_MAC', context['ctrl_mac']) - tmp = tmp.replace('CTRL_MODEL', context['ctrl_model']) - xml += tmp - - for tap_cfg in context['taps']: - if tap_cfg['br_type'] == "ovs": - br_type = "openvswitch" - else: - br_type = tap_cfg['br_type'] - if br_type == 'bridge': - xml_ovs = xml_br - tmp = xml_ovs.replace('BR_TYPE', br_type) - tmp = tmp.replace('TAP_MAC', tap_cfg['tap_mac']) - tmp = tmp.replace('TAP_NAME', tap_cfg['tap_name']) - tmp = tmp.replace('BR_NAME', tap_cfg['br_name']) - xml += tmp - - xml += xml_tail - return xml - - @staticmethod - def check_required_options(context): - for key in ( - 'vm_name', - 'vm_memory', - 'vm_cpu', - 'image_path', - 'image_type', - 'taps'): - if key not in context: - raise Exception("vm config error, must set %s option" % key) - - def set_vm_defaults(self, context): - vm_9p_path = '%s/%s' % (self.work_dir, context['vm_name']) - shutil.rmtree(vm_9p_path, ignore_errors=True) - my_mkdir(vm_9p_path) - default = {'vm_memory': 4194304, - 'vm_cpu': 4, - 'image_type': 'qcow2', - 'br_type': 'ovs', - '9p_path': vm_9p_path, - 'eth_pci': None, - 'ctrl_br': 'br0', - 'ctrl_mac': randomMAC(), - 'ctrl_model': 'virtio', - 'ctrl_ip_setting': '192.168.100.100/24', - 'ctrl_gw': '192.168.100.1' - } - for k, v in default.items(): - context.setdefault(k, v) - - def _shutdown_vm(self): - out = check_output( - "virsh list | sed 1,2d | awk '{print $2}'", - shell=True) - vm_set = set(out.split()) - for vm in vm_set: - check_call("virsh shutdown %s" % vm, shell=True) - timeout = 60 - # wait for gracefully shutdown - while timeout > 0: - out = check_output( - "virsh list | sed 1,2d | awk '{print $2}'", - shell=True) - vm_set = set(out.split()) - if len(vm_set) == 0: - break - timeout -= 2 - my_sleep(2) - LOG.info("waiting for vms:%s to shutdown gracefully", vm_set) - # destroy by force - for vm in vm_set: - check_call("virsh destroy %s" % vm, shell=True) - # undefine all - out = check_output( - "virsh list --all | sed 1,2d | awk '{print $2}'", - shell=True) - vm_set = set(out.split()) - for vm in vm_set: - check_call("virsh undefine %s" % vm, shell=True) - # kill all qemu - check_and_kill('qemu-system-x86_64') - - def clean_all_vms(self): - self._shutdown_vm() - for _, ctrl in self.vm_9p_controllers.items(): - LOG.debug("remove vm9pfs dir:%s", ctrl.vm_9p_path) - shutil.rmtree(ctrl.vm_9p_path, ignore_errors=True) - self.vm_9p_controllers = {} - self.vm_configs = {} - # shutil.rmtree(self.work_dir, ignore_errors=True) - self.vnc_index = 0 - self.pci_index = 3 - self.net_index = 0 - self.vms = [] - return True - - def create_vm(self, context): - self.set_vm_defaults(context) - self.check_required_options(context) - xml = self.composite_xml(context) - vm_name = context['vm_name'] - file_name = os.path.join(self.work_dir, vm_name + '.xml') - with open(file_name, 'w') as f: - f.write(xml) - check_call('virsh define %s' % file_name, shell=True) - check_call('virsh start %s' % vm_name, shell=True) - vm_name = context['vm_name'] - vm_9pfs = context['9p_path'] - self.vm_9p_controllers[vm_name] = VMConfigBy9pfs(vm_9pfs) - self.vm_configs[vm_name] = context - LOG.debug("%s's vm_9pfs path:%s", vm_name, vm_9pfs) - return True - - def wait_vm(self, vm_name): - vm9pctrl = self.vm_9p_controllers[vm_name] - ret = vm9pctrl.wait_up() - if ret not in (True,): - raise Exception( - 'vm running but stuck in boot process, please manully check.') - LOG.debug('waitVM %s up ok, ret:%s', vm_name, ret) - return True - - def init_config_vm(self, vm_name): - """ - using libvirt 9pfs to config boot up options like network ip/gw. - - :param vm_name: the vm to be config with. - :return: True if succeed, Exception if fail. - """ - vm_cfg = self.vm_configs[vm_name] - vm9pctrl = self.vm_9p_controllers[vm_name] - # print self.vm_9p_controllers - init_cfg = vm_cfg['init_config'] - if "ctrl_ip_setting" in init_cfg: - ret = vm9pctrl.config_ip( - vm_cfg['ctrl_mac'], - init_cfg['ctrl_ip_setting']) - assert ret - LOG.info('initConfigVM config ip ok') - if 'ctrl_gw' in init_cfg: - ret = vm9pctrl.config_gw(init_cfg['ctrl_gw']) - assert ret - LOG.info('initConfigVM ctrl_gw ok') - if "ctrl_ip_setting" in init_cfg and "amqp_server" in init_cfg: - identity = init_cfg['ctrl_ip_setting'].split('/')[0] - if init_cfg['amqp_id'].strip(): - identity = init_cfg['amqp_id'].strip() - server = init_cfg['amqp_server'] - port = init_cfg['amqp_port'] - user = init_cfg['amqp_user'] - passwd = init_cfg['amqp_passwd'] - ret = vm9pctrl.config_amqp(identity, server, port, user, passwd) - assert ret - LOG.info('initConfigVM config_amqp ok') - if 'tap_pktloop_config' in init_cfg: - taps = vm_cfg['taps'] - macs = [] - for tap in taps: - macs.append(tap['tap_mac']) - ret = vm9pctrl.set_pktloop_dpdk(macs) - assert ret - LOG.info('initConfigVM set_pktloop_dpdk ok') - return True diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/env/basic/vm_xml_help.py b/testsuites/vstf/vstf_scripts/vstf/agent/env/basic/vm_xml_help.py deleted file mode 100644 index 89c10963..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/agent/env/basic/vm_xml_help.py +++ /dev/null @@ -1,84 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -xml_head = ''' - - VM_NAME - VM_MEMORY - VM_MEMORY - - CPU_NUM - - - - hvm - - - - - - - - destroy - restart - restart - - /usr/bin/qemu-system-x86_64''' -xml_disk = ''' - - - - - ''' - -xml_ctrl_br = ''' - - - - - -''' -xml_ovs = ''' - - - - - - - - - ''' -xml_br = ''' - - - - - - ''' - -xml_pci = ''' - - - -
- - ''' -xml_9p = ''' - - - - ''' -xml_tail = ''' - - - - -''' diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/env/builder.py b/testsuites/vstf/vstf_scripts/vstf/agent/env/builder.py deleted file mode 100644 index 19bf12f2..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/agent/env/builder.py +++ /dev/null @@ -1,56 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -import logging - -import stevedore - -LOG = logging.getLogger(__name__) - - -class PluginManager(object): - - def __init__(self): - self.instance = None - self.saved = {} - - def build(self, cfg): - scheme = cfg["scheme"] - if scheme in self.saved: - # reuse old instance - self.instance = self.saved[scheme] - else: - mgr = stevedore.driver.DriverManager(namespace="env_build.plugins", - name=scheme, - invoke_on_load=False) - self.instance = mgr.driver() - self.saved[scheme] = self.instance - - self.instance.clean() - return self.instance.build(cfg) - - def clean(self): - if self.instance: - self.instance.clean() - self.instance = None - - -if __name__ == "__main__": - import argparse - from vstf.controller.env_build.env_build import IntentParser - - parser = argparse.ArgumentParser() - parser.add_argument('--config', help='config file to parse') - args = parser.parse_args() - logging.basicConfig(level=logging.INFO) - parser = IntentParser(args.config) - cfg_intent = parser.parse_cfg_file() - for host_cfg in cfg_intent['env-build']: - tn = PluginManager() - tn.build(host_cfg) diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/env/driver_plugins/__init__.py b/testsuites/vstf/vstf_scripts/vstf/agent/env/driver_plugins/__init__.py deleted file mode 100644 index 83b8d15d..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/agent/env/driver_plugins/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/env/driver_plugins/manager.py b/testsuites/vstf/vstf_scripts/vstf/agent/env/driver_plugins/manager.py deleted file mode 100644 index e20b5dd5..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/agent/env/driver_plugins/manager.py +++ /dev/null @@ -1,46 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -import stevedore - - -class DriverPluginManager(object): - - def __init__(self): - self.plugins = {} - self.mgr = stevedore.extension.ExtensionManager( - namespace="drivers.plugins", invoke_on_load=True) - - def load(self, drivers): - plugin = self.determine_driver_type(drivers) - ext = self.mgr[plugin] - ext.obj.load(drivers) - return True - - def clean(self): - self.mgr.map(self._clean) - return True - - def _clean(self, ext, *args, **kwargs): - ext.obj.clean() - - def get_all_supported_drivers(self): - if not self.plugins: - for ext_name in self.mgr.names(): - ext = self.mgr[ext_name] - self.plugins[ext_name] = ext.obj.get_supported_drivers() - return self.plugins - - def determine_driver_type(self, drivers): - s = set(drivers) - for plugin, supported in self.get_all_supported_drivers().items(): - if not (s - set(supported)): - return plugin - else: - raise Exception('unspported drivers: %s' % drivers) diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/env/driver_plugins/model.py b/testsuites/vstf/vstf_scripts/vstf/agent/env/driver_plugins/model.py deleted file mode 100644 index 807143f0..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/agent/env/driver_plugins/model.py +++ /dev/null @@ -1,42 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -from abc import ABCMeta -from abc import abstractmethod - - -class DriverPlugin: - __metaclass__ = ABCMeta - - @abstractmethod - def __init__(self): - """don't pass in any args for __init__. - """ - - @abstractmethod - def clean(self): - """implement this clean function to clean environment before and after calling any other functions. - - """ - pass - - @abstractmethod - def load(self, drivers): - """load driver modules. - - :param list drivers:list of modules to be inserted. for example:[ixgbe,vhost_net] - - """ - pass - - @abstractmethod - def get_supported_drivers(self): - """return a list of supported driver modules. - """ - pass diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/env/driver_plugins/origin_driver.py b/testsuites/vstf/vstf_scripts/vstf/agent/env/driver_plugins/origin_driver.py deleted file mode 100644 index 2004b8e8..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/agent/env/driver_plugins/origin_driver.py +++ /dev/null @@ -1,50 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -from vstf.agent.env.driver_plugins import model -from vstf.common.utils import check_and_rmmod, check_call - - -class OriginDriverPlugin(model.DriverPlugin): - """ - implement for operating linux origin driver modules. - """ - - def __init__(self): - """ - list all origin drivers in self.origin_drivers - """ - self.origin_drivers = ['ixgbe', 'bnx2x', 'i40e', 'be2net', 'vhost_net'] - - def clean(self): - """clean drivers list in self.origin_drivers. - - """ - for mod in self.origin_drivers: - check_and_rmmod(mod) - - check_and_rmmod('tun') - return True - - def load(self, drivers): - """insmod drivers - - :param list drivers:list of drivers link ['ixgbe','vhost_net'] - """ - # load implicit 'tun' module dependency for vhost_net - if 'vhost_net' in drivers: - check_call("modprobe tun", shell=True) - - for drv in drivers: - check_call("modprobe %s" % drv, shell=True) - - return True - - def get_supported_drivers(self): - return self.origin_drivers diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/env/fsmonitor/FSMonitor.py b/testsuites/vstf/vstf_scripts/vstf/agent/env/fsmonitor/FSMonitor.py deleted file mode 100644 index 53cddebb..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/agent/env/fsmonitor/FSMonitor.py +++ /dev/null @@ -1,236 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - - -import os -import time -import logging -import subprocess -import sys - -import constant -from utils import IPCommandHelper, umount, check_and_rmmod, check_output, check_call, call - -LOG_FILE = '/tmp/fsmonitor.log' -PID_FILE = '/tmp/fsmonitor.pid' -LOG = logging.getLogger('__name__') - - -class VMOperation(object): - - def __init__(self): - self.RTE_SDK = '/home/dpdk-2.0.0' - self.RTE_TARGET = 'x86_64-native-linuxapp-gcc' - self.nr_hugepages = '512' - self.pid = 0 - self.ip_helper = IPCommandHelper() - - def config_ip(self, mac, ip): - device = self.ip_helper.mac_device_map[mac] - check_call("ifconfig %s %s up" % (device, ip), shell=True) - - def config_gw(self, ip): - call("route del default", shell=True) - check_call("route add default gw %s" % ip, shell=True) - - def recover_nic_binding(self, *tap_macs): - if self.pid: - os.kill(self.pid, 9) - self.pid = None - bdf_str = '' - for mac in tap_macs: - bdf = self.ip_helper.mac_bdf_map[mac] - bdf_str = bdf_str + ' ' + bdf - cmd = 'python %s/tools/dpdk_nic_bind.py --bind=virtio-pci %s' % ( - self.RTE_SDK, bdf_str) - LOG.debug("recover_nic_binding runs cmd = %s", cmd) - check_call(cmd, shell=True) - - def set_pktloop_dpdk(self, *tap_macs): - RTE_SDK = self.RTE_SDK - RTE_TARGET = self.RTE_TARGET - umount("/mnt/huge") - with open('/sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages', 'w') as f: - f.write(self.nr_hugepages) - check_call("mkdir -p /mnt/huge", shell=True) - check_call("mount -t hugetlbfs nodev /mnt/huge", shell=True) - check_call("modprobe uio", shell=True) - check_and_rmmod('igb_uio') - check_call( - "insmod %s/%s/kmod/igb_uio.ko" % - (RTE_SDK, RTE_TARGET), shell=True) - - bdf_str = '' - for mac in tap_macs: - bdf = self.ip_helper.mac_bdf_map[mac] - bdf_str = bdf_str + ' ' + bdf - - check_call( - 'python %s/tools/dpdk_nic_bind.py --bind=igb_uio %s' % - (RTE_SDK, bdf_str), shell=True) - cpu_num = int( - check_output( - 'cat /proc/cpuinfo | grep processor | wc -l', - shell=True)) - cpu_bit_mask = 0 - i = cpu_num - while i: - cpu_bit_mask = (cpu_bit_mask << 1) + 1 - i -= 1 - cpu_bit_mask = hex(cpu_bit_mask) - cmd = "%s/%s/app/testpmd -c %s -n %d -- --disable-hw-vlan --disable-rss --nb-cores=%d --rxq=%d --txq=%d --rxd=4096 --txd=4096" % ( - RTE_SDK, RTE_TARGET, cpu_bit_mask, cpu_num / 2, cpu_num - 1, (cpu_num - 1) / 2, (cpu_num - 1) / 2) - LOG.info("set_pktloop_dpdk runs cmd = %s", cmd) - p = subprocess.Popen(cmd.split()) - if not p.poll(): - self.pid = p.pid - return True - else: - raise Exception("start testpmd failed") - - def config_amqp(self, file_name): - if not os.path.isfile(file_name): - raise Exception("file: %s not exists." % file_name) - check_call("cp %s /etc/vstf/amqp/amqp.ini" % file_name, shell=True) - check_call("vstf-agent restart", shell=True) - return True - - def stop_vstf(self): - check_call("vstf-agent stop", shell=True) - return True - - -class FSMonitor(object): - - def __init__(self, pidfile=None, interval=1): - if pidfile: - self.pidfile = pidfile - else: - self.pidfile = PID_FILE - self.interval = interval - self.handlers = [] - self.kill_old() - umount(constant.FS_MOUNT_POINT) - check_call("mkdir -p %s" % constant.FS_MOUNT_POINT, shell=True) - check_call("mount -t 9p 9pfs %s" % constant.FS_MOUNT_POINT, shell=True) - os.chdir(constant.FS_MOUNT_POINT) - with open(constant.VM_UP_Flag_FILE, 'w'): - pass - - def kill_old(self): - out = check_output( - "ps -ef | grep -v grep | egrep 'python.*%s' | awk '{print $2}'" % - sys.argv[0], shell=True) - if out: - for pid in out.split(): - if int(pid) != os.getpid(): - os.kill(int(pid), 9) - LOG.debug("found daemon:pid=%s and kill.", pid) - - def set_fail(self, failed_reason): - with open(constant.VM_CMD_RETURN_CODE_FILE, 'w') as f: - f.writelines( - [constant.VM_CMD_EXCUTE_FAILED_FLAG_CONTENT, '\n', failed_reason]) - with open(constant.VM_CMD_DONE_FLAG_FILE, 'w') as f: - pass - - def set_success(self): - with open(constant.VM_CMD_RETURN_CODE_FILE, 'w') as f: - f.write(constant.VM_CMD_EXCUTE_SUCCES_FLAG_CONTENT) - with open(constant.VM_CMD_DONE_FLAG_FILE, 'w') as f: - pass - - def register_handler(self, obj): - self.handlers.append(obj) - - def daemonize(self): - try: - pid = os.fork() - if pid > 0: - sys.exit(0) - except OSError as e: - sys.stderr.write( - 'fork #1 failed:%d,(%s)\n' % - (e.errno, e.strerror)) - sys.exit(1) - os.setsid() - os.umask(0) - try: - pid = os.fork() - if pid > 0: - sys.exit(0) - except OSError as e: - sys.stderr.write( - 'fork #2 failed:%d,(%s)\n' % - (e.errno, e.strerror)) - sys.exit(1) - LOG.debug( - "pid:%d,ppid:%d,sid:%d", - os.getpid(), - os.getppid(), - os.getsid( - os.getpid())) - old = open('/dev/null', 'r') - os.dup2(old.fileno(), sys.stdin.fileno()) - old = open('/dev/null', 'a+') - os.dup2(old.fileno(), sys.stdout.fileno()) - old = open('/dev/null', 'a+', 0) - os.dup2(old.fileno(), sys.stderr.fileno()) - pid = str(os.getpid()) - file(self.pidfile, 'w+').write('%s\n' % pid) - - def run_forever(self): - # todo:resolve handlers name space conflict - self.daemonize() - while True: - time.sleep(self.interval) - files = os.listdir(constant.FS_MOUNT_POINT) - if constant.VM_CMD_SET_FLAG_FILE in files and constant.VM_CMD_CONTENT_FILE in files: - with open(constant.VM_CMD_CONTENT_FILE, 'r') as f: - out = f.read().strip() - LOG.debug("new command arrived:%s", out) - cmd_param = out.split() - cmd = cmd_param[0] - param = cmd_param[1:] - for obj in self.handlers: - if hasattr(obj, cmd) and callable(getattr(obj, cmd)): - LOG.debug("method:%s found!", cmd) - method = getattr(obj, cmd) - try: - method(*param) - self.set_success() - LOG.debug("cmd sucessfully done") - except Exception as e: - LOG.debug( - 'failed to run:%s %s,reason:%s', cmd, param, str(e)) - self.set_fail(str(e)) - break - else: - LOG.debug("method:%s not found!", cmd) - self.set_fail(constant.VM_CMD_NOT_FOUND) - os.remove(constant.VM_CMD_SET_FLAG_FILE) - os.remove(constant.VM_CMD_CONTENT_FILE) - - -if __name__ == '__main__': - # echo "set_pktloop_dpdk" > command;touch command_set - # echo "recover_nic_binding" > command;touch command_set - # echo "config_ip 56:6f:44:a5:3f:a2 192.168.188.200/23" > command;touch command_set - # echo "config_gw 192.168.188.1" > command;touch command_set - # echo set_pktloop_dpdk 56:6f:44:a5:3f:a2 56:6f:44:a5:3f:a3 > command;touch command_set - # echo recover_nic_binding 56:6f:44:a5:3f:a2 56:6f:44:a5:3f:a3 > - # command;touch command_set - import os - logging.basicConfig(level=logging.DEBUG, filename=LOG_FILE, filemode='w') - os.environ['PATH'] = os.environ["PATH"] + ":/usr/local/bin" - LOG.info(os.environ['PATH']) - vm_op = VMOperation() - agent = FSMonitor() - agent.register_handler(vm_op) - agent.run_forever() diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/env/fsmonitor/__init__.py b/testsuites/vstf/vstf_scripts/vstf/agent/env/fsmonitor/__init__.py deleted file mode 100644 index 83b8d15d..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/agent/env/fsmonitor/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/env/fsmonitor/constant.py b/testsuites/vstf/vstf_scripts/vstf/agent/env/fsmonitor/constant.py deleted file mode 100644 index 3ae80a39..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/agent/env/fsmonitor/constant.py +++ /dev/null @@ -1,21 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -VM_UP_Flag_FILE = 'up' -VM_CMD_DONE_FLAG_FILE = 'command_done' -VM_CMD_RESULT_FILE = 'command_result_data' -VM_CMD_SET_FLAG_FILE = 'command_set' -VM_CMD_CONTENT_FILE = 'command' -VM_CMD_RETURN_CODE_FILE = 'command_result' -VM_CMD_EXCUTE_SUCCES_FLAG_CONTENT = 'success' -VM_CMD_EXCUTE_FAILED_FLAG_CONTENT = 'fail' -VM_CMD_NOT_FOUND = 'comamnd_not_found' -VM_UP_TIME_OUT = 120 -VM_COMMON_CMD_EXCUTE_TIME_OUT = 10 -FS_MOUNT_POINT = '/mnt/9pfs' diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/env/fsmonitor/utils.py b/testsuites/vstf/vstf_scripts/vstf/agent/env/fsmonitor/utils.py deleted file mode 100644 index c28b6ec6..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/agent/env/fsmonitor/utils.py +++ /dev/null @@ -1,120 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -import subprocess -from StringIO import StringIO -import re -import logging - -LOG = logging.getLogger(__name__) - - -def call(cmd, shell=False): - if shell: - LOG.info(cmd) - else: - LOG.info(' '.join(cmd)) - return subprocess.call(cmd, shell=shell) - - -def check_call(cmd, shell=False): - if shell: - LOG.info(cmd) - else: - LOG.info(' '.join(cmd)) - subprocess.check_call(cmd, shell=shell) - - -def check_output(cmd, shell=False): - if shell: - LOG.info(cmd) - else: - LOG.info(' '.join(cmd)) - return subprocess.check_output(cmd, shell=shell) - - -def check_and_kill(process): - cmd = "ps -ef | grep -v grep | awk '{print $8}' | grep -w %s | wc -l" % process - out = check_output(cmd, shell=True) - if int(out): - check_call(['killall', process]) - - -def check_and_rmmod(mod): - cmd = "lsmod | awk '{print $1}' | grep -w %s | wc -l" % mod - out = check_output(cmd, shell=True) - if int(out): - check_call(['rmmod', mod]) - - -def umount(path): - mount_path_set = set() - out = check_output("cat /proc/mounts", shell=True) - f = StringIO(out) - line = f.readline() - while line: - line = f.readline() - if line: - mpath = line.split()[1] - mount_path_set.add(mpath) - if path in mount_path_set: - ret = call("umount %s" % path, shell=True) - return ret == 0 - return True - - -class IPCommandHelper(object): - - def __init__(self): - self.devices = [] - self.macs = [] - self.device_mac_map = {} - self.mac_device_map = {} - self.bdf_device_map = {} - self.device_bdf_map = {} - self.mac_bdf_map = {} - self.bdf_mac_map = {} - buf = check_output("ip link", shell=True) - macs = re.compile( - "[A-F0-9]{2}(?::[A-F0-9]{2}){5}", - re.IGNORECASE | re.MULTILINE) - for mac in macs.findall(buf): - if mac.lower() in ('00:00:00:00:00:00', 'ff:ff:ff:ff:ff:ff'): - continue - self.macs.append(mac) - sio = StringIO(buf) - for line in sio: - m = re.match(r'^\d+:(.*):.*', line) - if m and m.group(1).strip() != 'lo': - self.devices.append(m.group(1).strip()) - for device, mac in zip(self.devices, self.macs): - self.device_mac_map[device] = mac - self.mac_device_map[mac] = device - for device in self.devices: - buf = check_output("ethtool -i %s" % device, shell=True) - bdfs = re.findall( - r'^bus-info: \d{4}:(\d{2}:\d{2}\.\d*)$', - buf, - re.MULTILINE) - if bdfs: - self.bdf_device_map[bdfs[0]] = device - self.device_bdf_map[device] = bdfs[0] - mac = self.device_mac_map[device] - self.mac_bdf_map[mac] = bdfs[0] - self.bdf_mac_map[bdfs[0]] = mac - - -if __name__ == '__main__': - ip_helper = IPCommandHelper() - print ip_helper.device_mac_map - print ip_helper.mac_device_map - print ip_helper.bdf_device_map - print ip_helper.device_bdf_map - print ip_helper.mac_bdf_map - print ip_helper.bdf_mac_map diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/env/plugins/__init__.py b/testsuites/vstf/vstf_scripts/vstf/agent/env/plugins/__init__.py deleted file mode 100644 index 83b8d15d..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/agent/env/plugins/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/env/plugins/libvirt_plugin.py b/testsuites/vstf/vstf_scripts/vstf/agent/env/plugins/libvirt_plugin.py deleted file mode 100644 index 2fd7d69a..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/agent/env/plugins/libvirt_plugin.py +++ /dev/null @@ -1,71 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -import logging - -from vstf.common.utils import ping, my_sleep -from vstf.agent.env.plugins.model import EnvBuilderPlugin -from vstf.agent.env.basic.source_manager import SourceCodeManager -from vstf.agent.env.basic.vm_manager import VMControlOperation -from vstf.agent.env.vswitch_plugins.manager import VswitchPluginManager -from vstf.agent.env.driver_plugins.manager import DriverPluginManager - -LOG = logging.getLogger(__name__) - - -class Plugin(EnvBuilderPlugin): - - def __init__(self): - super(Plugin, self).__init__() - self.vm_mgr = VMControlOperation() - self.vs_mgr = VswitchPluginManager() - self.dr_mgr = DriverPluginManager() - - def clean(self): - self.vm_mgr.clean_all_vms() - self.vs_mgr.clean() - self.dr_mgr.clean() - - def load_drivers(self): - drivers = self.host_cfg['drivers'] - self.dr_mgr.load(drivers) - - def create_brs(self): - for br_cfg in self.host_cfg['bridges']: - plugin = self.vs_mgr.get_vs_plugin(br_cfg['type']) - plugin.create_br(br_cfg) - - def config_br_ports(self): - for vm_cfg in self.host_cfg['vms']: - for tap_cfg in vm_cfg['taps']: - plugin = self.vs_mgr.get_vs_plugin(tap_cfg['br_type']) - plugin.set_tap_vid(tap_cfg) - for br_cfg in self.host_cfg['bridges']: - plugin = self.vs_mgr.get_vs_plugin(br_cfg['type']) - plugin.set_fastlink(br_cfg) - - def create_vms(self): - for vm_cfg in self.host_cfg['vms']: - self.vm_mgr.create_vm(vm_cfg) - - def wait_vms(self): - for vm_cfg in self.host_cfg['vms']: - self.vm_mgr.wait_vm(vm_cfg['vm_name']) - self.vm_mgr.init_config_vm(vm_cfg['vm_name']) - - def check_vm_connectivity(self): - for vm_cfg in self.host_cfg['vms']: - vm_ip = vm_cfg['init_config']['ctrl_ip_setting'].split('/')[0] - for _ in range(3): - ret = ping(vm_ip) - if ret: - break - my_sleep(3) - else: - raise Exception("ping ip:%s failed." % vm_ip) diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/env/plugins/model.py b/testsuites/vstf/vstf_scripts/vstf/agent/env/plugins/model.py deleted file mode 100644 index b19ceb96..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/agent/env/plugins/model.py +++ /dev/null @@ -1,58 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -from abc import ABCMeta -from abc import abstractmethod - - -class EnvBuilderPlugin: - __metaclass__ = ABCMeta - - def __init__(self): - self.host_cfg = None - pass - - @abstractmethod - def clean(self): - pass - - @abstractmethod - def load_drivers(self): - pass - - @abstractmethod - def create_brs(self): - pass - - @abstractmethod - def config_br_ports(self): - pass - - @abstractmethod - def create_vms(self): - pass - - @abstractmethod - def wait_vms(self): - pass - - @abstractmethod - def check_vm_connectivity(self): - pass - - def build(self, cfg_intent): - self.host_cfg = cfg_intent - self.clean() - self.load_drivers() - self.create_brs() - self.create_vms() - self.wait_vms() - self.config_br_ports() - self.check_vm_connectivity() - return True diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/env/plugins/tester_env_plugin.py b/testsuites/vstf/vstf_scripts/vstf/agent/env/plugins/tester_env_plugin.py deleted file mode 100644 index 0c994d4e..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/agent/env/plugins/tester_env_plugin.py +++ /dev/null @@ -1,47 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -import logging - -from vstf.agent.env.plugins.model import EnvBuilderPlugin -from vstf.agent.env.driver_plugins.manager import DriverPluginManager - -LOG = logging.getLogger(__name__) - - -class Plugin(EnvBuilderPlugin): - - def __init__(self): - super(Plugin, self).__init__() - self.dr_mgr = DriverPluginManager() - - def clean(self): - self.dr_mgr.clean() - - def install(self): - pass - - def load_drivers(self): - drivers = self.host_cfg['drivers'] - self.dr_mgr.load(drivers) - - def create_brs(self): - pass - - def config_br_ports(self): - pass - - def create_vms(self): - pass - - def wait_vms(self): - pass - - def check_vm_connectivity(self): - pass diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/env/vswitch_plugins/__init__.py b/testsuites/vstf/vstf_scripts/vstf/agent/env/vswitch_plugins/__init__.py deleted file mode 100644 index 83b8d15d..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/agent/env/vswitch_plugins/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/env/vswitch_plugins/bridge_plugin.py b/testsuites/vstf/vstf_scripts/vstf/agent/env/vswitch_plugins/bridge_plugin.py deleted file mode 100644 index fb6a54ce..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/agent/env/vswitch_plugins/bridge_plugin.py +++ /dev/null @@ -1,74 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -from vstf.agent.env.vswitch_plugins import model -from vstf.common.utils import check_call, get_eth_by_bdf, check_output - - -class BridgePlugin(model.VswitchPlugin): - - def __init__(self): - pass - - def clean(self): - """clean brs created before. - - """ - out = check_output( - r"brctl show | grep -v '^\s' | awk '{print $1}'|sed '1,1d'", - shell=True) - print out - for br in out.split(): - if br != 'br0': - self._del_br(br) - - return True - - def init(self): - pass - - def _del_br(self, name): - check_call('ip link set dev %s down' % name, shell=True) - check_call('brctl delbr %s' % name, shell=True) - - def create_br(self, br_cfg): - """Create a bridge(virtual switch). Return True for success, return False for failure. - - :param dict br_cfg: configuration for bridge creation like - { - "name": "br1", - "uplinks": [ - { - "bdf": "04:00.0", - }, - { - "bdf": "04:00.1", - } - ] - } - - """ - name, uplinks = br_cfg['name'], br_cfg['uplinks'] - check_call("brctl addbr %s" % name, shell=True) - for uplink in uplinks: - device = get_eth_by_bdf(uplink['bdf']) - check_call("ip link set dev %s up" % device, shell=True) - check_call("brctl addif %s %s" % (name, device), shell=True) - check_call("ip link set dev %s up" % name, shell=True) - return True - - def set_tap_vid(self, tap_cfg): - """linux bridge doesn't support vlan id setting. - """ - return True - - def set_fastlink(self, br_cfg): - """linux bridge doesn't support openflow protocol. - """ - return True diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/env/vswitch_plugins/manager.py b/testsuites/vstf/vstf_scripts/vstf/agent/env/vswitch_plugins/manager.py deleted file mode 100644 index 4890ee11..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/agent/env/vswitch_plugins/manager.py +++ /dev/null @@ -1,37 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -import stevedore - - -class VswitchPluginManager(object): - - def __init__(self): - self.plugin = None - self.mgr = stevedore.extension.ExtensionManager( - namespace="vswitch.plugins", invoke_on_load=True) - - def clean(self): - if self.plugin: - self.plugin.clean() - self.plugin = None - for plugin in self.mgr.names(): - self.mgr[plugin].obj.clean() - return True - - def get_vs_plugin(self, plugin): - if plugin in self.mgr.names(): - ext = self.mgr[plugin] - self.plugin = ext.obj - return self.plugin - else: - raise Exception("unsupported vswitch plugin: %s" % plugin) - - def get_supported_plugins(self): - return self.mgr.names() diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/env/vswitch_plugins/model.py b/testsuites/vstf/vstf_scripts/vstf/agent/env/vswitch_plugins/model.py deleted file mode 100644 index 8a80e44e..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/agent/env/vswitch_plugins/model.py +++ /dev/null @@ -1,67 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -from abc import ABCMeta -from abc import abstractmethod - - -class VswitchPlugin: - __metaclass__ = ABCMeta - - @abstractmethod - def clean(self): - """implement this clean function to clean environment before and after calling any other functions. - - """ - pass - - @abstractmethod - def init(self): - """implements this init function to setup necessary Preconditions. - - """ - pass - - @abstractmethod - def create_br(self, br_cfg): - """Create a bridge(virtual switch). Return True for success, return False for failure. - - :param dict br_cfg: configuration for bridge creation like - { - "type": "ovs", - "name": "ovs1", - "uplinks": [ - { - "bdf": "04:00.0", - "vlan_mode": "access", - "vlan_id": "1" - } - ], - "vtep": {}, - } - - """ - pass - - @abstractmethod - def set_tap_vid(self, tap_cfg): - """set vlan id or vxlan id for tap device(virtual nic for vm). - - :param dict tap_cfg: dictionary config for tap device like - { - "tap_name": "tap_in", - "vlan_mode": "access", - "vlan_id": "1" - } - - """ - pass - - def set_fastlink(self, br_cfg): - return True diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/env/vswitch_plugins/ovs_plugin.py b/testsuites/vstf/vstf_scripts/vstf/agent/env/vswitch_plugins/ovs_plugin.py deleted file mode 100644 index 66943c1c..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/agent/env/vswitch_plugins/ovs_plugin.py +++ /dev/null @@ -1,206 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -import os -import shutil -import logging -import time -import re - -from vstf.agent.env.vswitch_plugins import model -from vstf.common.utils import check_and_kill, check_and_rmmod, check_call, check_output, \ - get_eth_by_bdf, my_mkdir, call - -LOG = logging.getLogger(__name__) - - -class OvsPlugin(model.VswitchPlugin): - - def __init__(self): - self.daemons = ['ovs-vswitchd', 'ovsdb-server'] - self.mods = ['openvswitch'] - self.dirs = {'db': "/usr/local/etc/openvswitch"} - self.cmds = [] - self.cmds.append("mkdir -p /usr/local/etc/openvswitch") - self.cmds.append( - "ovsdb-tool create /usr/local/etc/openvswitch/conf.db") - self.cmds.append("ovsdb-server --remote=punix:/usr/local/var/run/openvswitch/db.sock \ - --remote=db:Open_vSwitch,Open_vSwitch,manager_options \ - --private-key=db:Open_vSwitch,SSL,private_key \ - --certificate=db:Open_vSwitch,SSL,certificate \ - --bootstrap-ca-cert=db:Open_vSwitch,SSL,ca_cert \ - --pidfile --detach") - self.cmds.append("ovs-vsctl --no-wait init") - self.cmds.append("ovs-vswitchd --pidfile --detach") - self.initialized = False - - def init(self): - if not self.initialized: - self._start_servers() - self.initialized = True - - def clean(self): - """clean for ovs. Rmmod openvswitch.ko, kill openvswitch daemon process. - - """ - for process in self.daemons: - check_and_kill(process) - for mod in self.mods: - check_and_rmmod(mod) - for _, directory in self.dirs.items(): - if os.path.isdir(directory): - LOG.info('rm -rf %s', directory) - shutil.rmtree(directory, ignore_errors=True) - self.initialized = False - return True - - def create_br(self, br_cfg): - """Create a bridge(virtual switch). Return True for success, return False for failure. - - :param dict br_cfg: configuration for bridge creation like - { - "type": "ovs", - "name": "ovs1", - "uplinks": [ - { - "bdf": "04:00.0", - "vlan_mode": "access", - "vlan_id": "1" - } - ], - "vtep": {}, - } - - """ - self.init() - name, uplinks = br_cfg['name'], br_cfg['uplinks'] - - check_call("ovs-vsctl add-br %s" % (name), shell=True) - if br_cfg['vtep']: # vxlan supports - local_ip, remote_ip = br_cfg['vtep'][ - 'local_ip'], br_cfg['vtep']['remote_ip'] - assert len(uplinks) == 1 - uplink = uplinks[0] - device = get_eth_by_bdf(uplink['bdf']) - time.sleep(0.5) - vtep = 'vx1' - check_call("ifconfig %s %s up" % (device, local_ip), shell=True) - check_call("ovs-vsctl add-port %s %s" % (name, vtep), shell=True) - check_call( - "ovs-vsctl set interface %s type=vxlan options:remote_ip=%s" % - (vtep, remote_ip), shell=True) - for uplink in uplinks: - device = get_eth_by_bdf(uplink['bdf']) - vlan_mode = uplink['vlan_mode'] - vlan_id = uplink['vlan_id'] - check_call("ip link set dev %s up" % device, shell=True) - call("ethtool -A %s rx off tx off " % device, shell=True) - check_call("ovs-vsctl add-port %s %s" % (name, device), shell=True) - if vlan_mode == 'trunk': - check_call( - "ovs-vsctl set port %s trunks=%s" % - (device, vlan_id), shell=True) - elif vlan_mode == 'access': - check_call( - "ovs-vsctl set port %s tag=%s" % - (device, vlan_id), shell=True) - else: - raise Exception("unreconized vlan_mode:%s" % vlan_mode) - return True - - def set_tap_vid(self, tap_cfg): - """set vlan id or vxlan id for tap device(virtual nic for vm). - return True for success, return False for failure. - - :param dict tap_cfg: dictionary config for tap device like - { - "tap_name": "tap_in", - "vlan_mode": "access", - "vlan_id": "1" - } - - """ - port, vlan_mode, vlan = tap_cfg['tap_name'], tap_cfg[ - 'vlan_mode'], tap_cfg['vlan_id'] - assert vlan_mode in ('access', 'vxlan') - if int(vlan) > '4095': - # vxlan setting - self.__set_tap_vid(port, "vxlan", vlan) - else: - # vlan setting - self.__set_tap_vid(port, vlan_mode, vlan) - return True - - def set_fastlink(self, br_cfg): - """connect two ports directly, so that packets comes from any one port be forwarded to the other. - return True for success, return False for failure. - - :param dict br_cfg: dictionary configuration for linking ports. - { - "name": "ovs1", - "fastlink": [ - { - "inport": "04:00.0", - "outport": "tap_in" - } - ] - } - """ - br_name = br_cfg['name'] - for fast_cfg in br_cfg['fastlink']: - p1, p2 = fast_cfg['inport'], fast_cfg['outport'] - self.__fastlink(br_name, p1, p2) - return True - - def _start_servers(self): - for _, directory in self.dirs.items(): - my_mkdir(directory) - for mod in self.mods: - check_call("modprobe %s" % mod, shell=True) - for cmd in self.cmds: - check_call(cmd, shell=True) - return True - - def __set_tap_vid(self, port, vlan_mode, vlan_id): - if vlan_mode == 'vxlan': - raise Exception("don't support vxlan setting right now.") - elif vlan_mode == 'trunk': - check_call( - "ovs-vsctl set port %s trunks=%s" % - (port, vlan_id), shell=True) - else: - check_call( - "ovs-vsctl set port %s tag=%s" % - (port, vlan_id), shell=True) - - def __fastlink(self, br, p1, p2): - LOG.info("_fastlink(%s,%s,%s)", br, p1, p2) - p1 = p1.replace(' ', '') - p2 = p2.replace(' ', '') - bdfs = check_output( - "lspci |grep Eth | awk '{print $1}'", - shell=True).splitlines() - if p1 in bdfs: - p1 = get_eth_by_bdf(p1) - if p2 in bdfs: - p2 = get_eth_by_bdf(p2) - ovs_port = {} - buf = check_output("ovs-ofctl show %s" % br, shell=True) - port_info = re.compile(r"[0-9]+\(.*\)", re.IGNORECASE | re.MULTILINE) - for s in port_info.findall(buf): - port_num, interface = s.replace('(', ' ').replace(')', ' ').split() - ovs_port[interface] = port_num - pn1, pn2 = ovs_port[p1], ovs_port[p2] - check_call( - "ovs-ofctl add-flow %s in_port=%s,priority=100,action=output:%s" % - (br, pn1, pn2), shell=True) - check_call( - "ovs-ofctl add-flow %s in_port=%s,priority=100,action=output:%s" % - (br, pn2, pn1), shell=True) - return True diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/equalizer/__init__.py b/testsuites/vstf/vstf_scripts/vstf/agent/equalizer/__init__.py deleted file mode 100644 index 83b8d15d..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/agent/equalizer/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/equalizer/equalizer.py b/testsuites/vstf/vstf_scripts/vstf/agent/equalizer/equalizer.py deleted file mode 100644 index 2fd20db1..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/agent/equalizer/equalizer.py +++ /dev/null @@ -1,78 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -import os -import re -import subprocess -import logging - -log = logging.getLogger(__name__) - - -def run_cmd(cmd, shell=True): - try: - ret = subprocess.check_output(cmd, shell=shell) - except subprocess.CalledProcessError as e: - raise e - return ret - - -class Resource(object): - - def __init__(self): - super(Resource, self).__init__() - self.sysfs = "/sys/devices/system/node" - self.mapping = {} - for node in self._init_numa(): - self.mapping[node] = {} - - process_mapping = self._get_process_mapping(node) - for process_index in xrange(0, len(bin(process_mapping)) - 2): - if process_mapping & 1 << process_index != 0: - core = self._get_core_id(node, process_index) - if core not in self.mapping[node]: - self.mapping[node][core] = [] - self.mapping[node][core].append(process_index) - - def _get_process_mapping(self, numa_node): - ret = run_cmd("cat " + self.sysfs + '/' + numa_node + - '/cpumap').replace(',', '').lstrip('0') - return int(ret, 16) - - def _get_core_id(self, numa_node, process_index): - cmd = "cat " + self.sysfs + '/' + numa_node + \ - '/cpu' + str(process_index) + '/topology/core_id' - return run_cmd(cmd).strip('\n') - - def _init_numa(self): - """the node name is node0, node1......""" - try: - node_list = os.listdir(self.sysfs) - except Exception as e: - raise e - ret = [] - partten = re.compile("^node[0-9]{,}$") - for node in node_list: - if partten.match(node) is None: - continue - ret.append(node) - return ret - - -class Equalizer(Resource): - - def __init__(self): - super(Equalizer, self).__init__() - - def topology(self): - print self.mapping - - -e = Equalizer() -e.topology() diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/equalizer/get_info.py b/testsuites/vstf/vstf_scripts/vstf/agent/equalizer/get_info.py deleted file mode 100644 index 8a01dfc6..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/agent/equalizer/get_info.py +++ /dev/null @@ -1,179 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -import commands - -try: - import xml.etree.cElementTree as ET -except ImportError: - import xml.etree.ElementTree as ET - - -class GetPhyInfo(object): - - def __init__(self): - pass - - def _get_range(self, temp): - topo = {} - phy_core_flag = True - for sub in temp.split(','): - r_list = [] - _start = sub.split('-')[0] - _end = sub.split('-')[1] - r_list.extend(range(int(_start), int(_end) + 1)) - if phy_core_flag: - topo['phy_cores'] = r_list - else: - topo['virt_cores'] = r_list - phy_core_flag = False - return topo - - def _get_numa_num(self): - flag, num = commands.getstatusoutput('lscpu | grep "NUMA node(s):"') - try: - num = num.split(':')[1] - except: - print('get numa %s value failed.' % (num)) - return num - - def get_numa_core(self): - numa = {} - num = self._get_numa_num() - for numa_id in range(0, int(num)): - flag, temp = commands.getstatusoutput( - 'lscpu | grep "NUMA node%s"' % - (str(numa_id))) - try: - temp = temp.split(':')[1].split()[0] - except: - print('get numa %s range %s failed.' % (str(numa_id), range)) - topo = self._get_range(temp) - numa['node' + str(numa_id)] = topo - return str(numa) - - def get_nic_numa(self, nic): - result = {} - try: - flag, id = commands.getstatusoutput( - 'cat /sys/class/net/%s/device/numa_node' % - (nic)) - except: - print('get nic numa id failed.') - return id - - def _get_main_pid(self, xml_file): - try: - tree = ET.ElementTree(file=xml_file) - root = tree.getroot() - _main_pid = root.attrib['pid'] - except: - print('[ERROR]Parse xml file failed, could not get qemu main pid') - return _main_pid - - def _get_qemu_threads(self, xml_file): - # import pdb - # pdb.set_trace() - _qemu_threads = [] - try: - tree = ET.ElementTree(file=xml_file) - root = tree.getroot() - for element in tree.iterfind('vcpus/vcpu'): - _qemu_threads.append(element.attrib['pid']) - except: - print('[ERROR]Parse xml file failed, could not get qemu threads.') - - return _qemu_threads - - def _get_mem_numa(self, xml_file): - try: - _mem_numa = None - tree = ET.ElementTree(file=xml_file) - root = tree.getroot() - for element in tree.iterfind('domain/numatune/memory'): - _mem_numa = element.attrib['nodeset'] - finally: - return _mem_numa - - def _get_vhost_threads(self, xml_file): - _vhost = [] - _main_pid = self._get_main_pid(xml_file) - - # get vhost info - proc_name = 'vhost-' + _main_pid - flag, temp = commands.getstatusoutput( - 'ps -ef | grep %s | grep -v grep' % - (proc_name)) - for line in temp.split('\n'): - try: - vhost = line.split()[1] - _vhost.append(vhost) - except: - print('get vhost %s proc id failed' % (line)) - - return _vhost - - def get_vm_info(self, vm_name): - vm = {} - src_path = '/var/run/libvirt/qemu/' - xml_file = src_path + vm_name + '.xml' - - # get vm main pid from file - _main_pid = self._get_main_pid(xml_file) - # get vm vcpu thread from the libvirt file - _qemu_threads = self._get_qemu_threads(xml_file) - # get vm bind mem numa id - _mem_numa = self._get_mem_numa(xml_file) - # get vhost thread - _vhosts = self._get_vhost_threads(xml_file) - - vm['main_pid'] = _main_pid - vm['qemu_thread'] = _qemu_threads - vm['mem_numa'] = _mem_numa - vm['vhost_thread'] = _vhosts - return vm - - def _get_proc_by_irq(self, irq): - try: - flag, info = commands.getstatusoutput( - 'ps -ef | grep irq/%s | grep -v grep ' % (irq)) - proc_id = info.split('\n')[0].split()[1] - except: - print("[ERROR]grep process id failed.") - return proc_id - - def get_nic_interrupt_proc(self, nic): - _phy_nic_thread = [] - flag, info = commands.getstatusoutput( - 'cat /proc/interrupts | grep %s' % (nic)) - for line in info.split('\n'): - try: - irq_num = line.split(':')[0].split()[0] - proc_id = self._get_proc_by_irq(irq_num) - _phy_nic_thread.append([irq_num, proc_id]) - except: - print("[ERROR]get irq num failed.") - return _phy_nic_thread - - def get_libvirt_vms(self): - vm_list = [] - flag, info = commands.getstatusoutput('virsh list') - list = info.split('\n') - if list[-1] == '': - list.pop() - del list[0] - del list[0] - - for line in list: - try: - vm_temp = line.split()[1] - vm_list.append(vm_temp) - except: - print("Get vm name failed from %s" % (line)) - return vm_list diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/equalizer/optimize.py b/testsuites/vstf/vstf_scripts/vstf/agent/equalizer/optimize.py deleted file mode 100644 index 4579c506..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/agent/equalizer/optimize.py +++ /dev/null @@ -1,69 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -import commands -import re - - -# import pdb -# pdb.set_trace() - -class Optimize(object): - - def __init__(self): - pass - - def bind_cpu(self, cpu_range, thread): - flag, num = commands.getstatusoutput( - 'taskset -pc %s %s' % - (cpu_range, thread)) - return flag - - def catch_thread_info(self): - thread_info = { - 'fwd_vhost': None, - 'src_recv_irq': None, - 'dst_send_irq': None} - # top -H get the usage info - flag, threads_usages = commands.getstatusoutput( - 'top -bH -n1 -c -w 2000') - line_array = threads_usages.split('\n') - # get highest vhost line - for line in line_array: - if re.search('vhost-', line) and self._check_thread_usage(line): - thread_info['fwd_vhost'] = line.split()[0] - break - # get highest irq thread as src_recv_irq thread - for line in line_array: - if re.search('irq/', line) and self._check_thread_usage(line): - thread_info['src_recv_irq'] = line.split()[0] - line_array.remove(line) - break - # get the second highest irq thread as dst_send_irq - for line in line_array: - if re.search('irq/', line) and self._check_thread_usage(line): - thread_info['dst_send_irq'] = line.split()[0] - break - # check the data valid - - for key in thread_info.keys(): - if thread_info[key] is None: - return False, str(thread_info) - return True, str(thread_info) - - def _check_thread_usage(self, line): - try: - usage = line.split()[8] - if float(usage) >= 3.0: - return True - else: - print("[ERROR]The highest thread %s is less than 0.05" % usage) - return False - except: - print("[ERROR]The thread usage get failed.") diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/perf/__init__.py b/testsuites/vstf/vstf_scripts/vstf/agent/perf/__init__.py deleted file mode 100644 index 83b8d15d..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/agent/perf/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/perf/affctl.py b/testsuites/vstf/vstf_scripts/vstf/agent/perf/affctl.py deleted file mode 100644 index 316cbab8..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/agent/perf/affctl.py +++ /dev/null @@ -1,20 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -from vstf.common.utils import check_call, call, check_output - - -def affctl_load(policy): - cmd = "affctl load %s" % policy - return check_call(cmd, shell=True) - - -def affctl_list(): - cmd = "affctl list" - return check_output(cmd, shell=True) diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/perf/ethtool.py b/testsuites/vstf/vstf_scripts/vstf/agent/perf/ethtool.py deleted file mode 100644 index 3f4a3728..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/agent/perf/ethtool.py +++ /dev/null @@ -1,59 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -import vstf.common.utils as utils - -__all__ = ["autoneg_on", "autoneg_off", "autoneg_query"] - -_para_map = { - "Autonegotiate": ("-A", "-a", "autoneg"), - "RX": ("-A", "-a", "rx"), - "TX": ("-A", "-a", "tx"), -} - - -def autoneg_on(iface, nspace=None): - return _set(nspace, iface, Autonegotiate="on", RX="on", TX="on") - - -def autoneg_off(iface, nspace=None): - return _set(nspace, iface, Autonegotiate="off", RX="off", TX="off") - - -def autoneg_query(iface, nspace=None): - return _query(nspace, iface, "-a") - - -def _set(nspace, iface, **kwargs): - cmds = {} - for item, value in kwargs.items(): - opt, _, key = _para_map[item] - cmds.setdefault(opt, []) - cmds[opt].append(key) - cmds[opt].append(value) - - for key, value in cmds.items(): - cmd = _namespace(nspace) - cmd += ["ethtool", key, iface] + value - utils.call(cmd) - - return True - - -def _query(nspace, iface, item): - cmd = _namespace(nspace) - cmd += ["ethtool", item, iface] - return utils.check_output(cmd) - - -def _namespace(nspace): - result = "" - if nspace: - result = "ip netns exec %(namespace)s " % {"namespace": nspace} - return result.split() diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/perf/iperf.py b/testsuites/vstf/vstf_scripts/vstf/agent/perf/iperf.py deleted file mode 100644 index 8eca165c..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/agent/perf/iperf.py +++ /dev/null @@ -1,165 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -import subprocess -import signal -import os -import time -import logging - -import vstf.common.decorator as deco -import vstf.agent.perf.utils as utils -from vstf.common.utils import kill_by_name - -LOG = logging.getLogger(__name__) - - -class Iperf(object): - - def __init__(self): - self._send_processes = [] - self._receive_processes = [] - self._typemap = { - "tcp_bw": "", - "udp_bw": " -u ", - } - - @deco.check("protocol", choices=['tcp_bw', 'udp_bw']) - @deco.check("namespace", defaults=None) - @deco.check("dst") - @deco.check("time", defaults=600) - @deco.check("size", defaults=64) - @deco.check("threads", defaults=1) - def send_start(self, **kwargs): - - cmd = self.format_send_start(**kwargs) - LOG.debug("cmd:%s", cmd) - - process = subprocess.Popen( - cmd.split(), - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - time.sleep(1) - ret = process.poll() - if ret is None: - ret = 0 - error_str = "start iperf send success" - self._send_processes.append(process) - else: - print ret - error_str = "start iperf send failed, %s", (str(kwargs)) - - return ret, error_str - - @deco.namespace() - def format_send_start(self, **kwargs): - cmd = "iperf %(type)s -c %(dst_ip)s -i 1 -l %(pkt_size)s -t %(time)s -P %(threads)s " - context = { - 'type': self._typemap[kwargs['protocol']], - 'dst_ip': kwargs['dst'][0]['ip'], - 'time': kwargs['time'], - 'pkt_size': kwargs['size'], - 'threads': kwargs['threads'], - } - cmd = cmd % context - return cmd - - def send_stop(self): - results = [] - for process in self._send_processes: - poll = process.poll() - if poll is None: - process.kill() - ret = 0 - read = "process is stopped by killed" - results.append((ret, read)) - - self._send_processes = [] - return results - - @deco.namespace() - def format_receive_start(self, **kwargs): - cmd = 'iperf %s -s ' % (self._typemap[kwargs['protocol']]) - return cmd - - @deco.check("protocol", choices=['tcp_bw', 'udp_bw']) - @deco.check("namespace", defaults=None) - def receive_start(self, **kwargs): - cmd = self.format_receive_start(**kwargs) - LOG.debug("cmd:%s", cmd) - - process = subprocess.Popen( - cmd.split(), - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - time.sleep(1) - ret = process.poll() - if ret is None: - ret = 0 - error_str = "start iperf receive success" - self._receive_processes.append(process) - else: - print ret - error_str = "start iperf receive failed, %s" % (str(kwargs)) - return ret, error_str - - def receive_stop(self): - ret = 0 - for process in self._receive_processes: - process.kill() - ret = process.wait() - self._receive_processes = [] - return ret - - def receive_kill(self): - ret = 0 - receive_pids = utils.get_pid_by_name('iperf') - for pid in receive_pids: - os.kill(pid, signal.SIGKILL) - time.sleep(0.5) - error_str = "stop iperf receive success" - LOG.debug(error_str) - return ret, error_str - - def force_clean(self): - LOG.info("%s %s start", self.__class__, self.force_clean.__name__) - kill_by_name('iperf') - self._send_processes = [] - self._receive_processes = [] - return True - - -def unit_test(): - perf = Iperf() - pro = 'udp_bw' - print perf.receive_start(namespace='receive', protocol=pro) - - send = { - "namespace": "send", - "protocol": "udp_bw", - "dst": [ - {"ip": "192.168.1.102"} - ], - "size": 64, - "time": 5, - } - print perf.send_start(**send) - time.sleep(10) - print perf.send_stop() - print perf.receive_stop() - - -if __name__ == "__main__": - from vstf.common.log import setup_logging - - setup_logging( - level=logging.DEBUG, - log_file="/var/log/vstf-iperf.log", - clevel=logging.DEBUG) - unit_test() diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/perf/netmap.py b/testsuites/vstf/vstf_scripts/vstf/agent/perf/netmap.py deleted file mode 100644 index bd9cc97f..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/agent/perf/netmap.py +++ /dev/null @@ -1,178 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -import time -import subprocess -import vstf.common.decorator as deco -from vstf.common.utils import kill_by_name, my_popen - -import logging - -LOG = logging.getLogger(__name__) - - -class Netmap(object): - - def __init__(self): - self._send_processes = [] - self._receive_processes = [] - - @deco.check("protocol", choices=['udp_bw'], defaults='udp_bw') - @deco.check("namespace", defaults=None) - @deco.check("dst") - @deco.check("src") - @deco.check("size", defaults=64) - @deco.check("threads", defaults=1) - @deco.check("ratep", defaults=0) - def send_start(self, **kwargs): - cmd = self.format_send_start(**kwargs) - LOG.info("cmd:%s", cmd) - - process = my_popen( - cmd.split(), - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - self._send_processes.append(process) - time.sleep(0.5) - - ret = process.poll() - if ret is None: - ret = 0 - error_str = "start netmap send success" - else: - error_str = "start netmap send failed, %s" % (str(kwargs)) - process.wait() - self._send_processes.remove(process) - - return ret, error_str - - def send_stop(self, **kwargs): - LOG.info("send_stop") - results = [] - ret = 0 - for process in self._send_processes: - process.kill() - process.wait() - error_str = "stop netmap send success" - results.append((ret, error_str)) - self._send_processes = [] - return results - - def format_send_start(self, **kwargs): - cmd = "pkt-gen -i %(src_iface)s -f tx -l %(pkt_size)s -p %(threads)s -D %(dst_mac)s -R %(ratep)s" - context = { - 'src_iface': kwargs['src'][0]['iface'], - 'dst_mac': kwargs['dst'][0]['mac'], - 'pkt_size': kwargs['size'], - 'threads': kwargs['threads'], - 'ratep': kwargs['ratep'] - } - cmd = cmd % context - return cmd - - @deco.namespace() - def format_receive_start(self, **kwargs): - cmd = "pkt-gen -i %(iface)s -f rx" - context = { - 'iface': kwargs['dst'][0]['iface'] - } - cmd = cmd % context - return cmd - - @deco.check("protocol", choices=['udp_bw'], defaults='udp_bw') - @deco.check("namespace", defaults=None) - @deco.check("dst") - def receive_start(self, **kwargs): - - cmd = self.format_receive_start(**kwargs) - LOG.info("cmd:%s", cmd) - - process = my_popen( - cmd.split(), - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - self._receive_processes.append(process) - time.sleep(0.5) - - ret = process.poll() - if ret is None: - ret = 0 - error_str = "start netmap receive success" - else: - error_str = "start netmap receive failed, %s" % (str(kwargs)) - process.wait() - self._receive_processes.remove(process) - - return ret, error_str - - def receive_stop(self, **kwargs): - LOG.info("receive_stop") - ret = 0 - for process in self._receive_processes: - process.kill() - process.wait() - self._receive_processes = [] - error_str = "stop netmap receive success" - self._receive_processes = [] - return ret, error_str - - def clean(self): - self.send_stop() - self.receive_stop() - return True - - def force_clean(self): - LOG.info("%s %s start", self.__class__, self.force_clean.__name__) - kill_by_name('pkt-gen') - self._send_processes = [] - self._receive_processes = [] - return True - - -def unit_test(): - perf = Netmap() - receive = { - "protocol": "udp_bw", - # "namespace": "receive", - "dst": [ - {"iface": "p57p2"} - ], - } - ret = perf.receive_start(**receive) - LOG.info("*********receive_start***********") - LOG.info("ret") - send = { - # "namespace": "send", - "protocol": "udp_bw", - "src": [ - {"iface": "eth4", "mac": "90:e2:ba:20:1f:d8"} - ], - "dst": [ - {"mac": "90:e2:ba:20:1f:d9"} - ], - "size": 64, - "threads": 1, - "ratep": 0 - } - print perf.send_start(**send) - print perf._send_processes - time.sleep(10) - - print perf.send_stop() - print perf.receive_stop() - - -if __name__ == "__main__": - from vstf.common.log import setup_logging - - setup_logging( - level=logging.DEBUG, - log_file="/var/log/vstf/vstf-netmap.log", - clevel=logging.INFO) - unit_test() diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/perf/netns.py b/testsuites/vstf/vstf_scripts/vstf/agent/perf/netns.py deleted file mode 100644 index 9aaaf58f..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/agent/perf/netns.py +++ /dev/null @@ -1,109 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -import logging -from vstf.common.utils import IPCommandHelper -from vstf.agent.perf import ethtool -from vstf.common.utils import check_call, check_output, ns_cmd, my_popen, my_sleep - -LOG = logging.getLogger(__name__) - - -class Netns(object): - - def __init__(self): - super(Netns, self).__init__() - self.netns_add_str = "ip netns add %s" - self.netns_del_str = " ip netns del %s" - self.netns_add_device_str = " ip link set %s netns %s" - self.set_link_up_str = "ip link set dev %s up" - self.set_link_addr_str = "ip addr replace %s dev %s" - self.netns_remove_device_str = "ip netns exec %s ip link set %s netns 1" - # self.set_link_addr_str = "ifconfig %s %s up" - self.ns_devices = {} - - def clean_all_namespace(self): - out = check_output("ip netns list", shell=True) - for ns in out.splitlines(): - self.remove_namespace(ns) - return True - - def create_namespace(self, name): - if name in (None, 'None', 'none'): - return True - cmd = self.netns_add_str % name - check_call(cmd, shell=True) - return True - - def remove_namespace(self, ns): - if ns in (None, 'None', 'none'): - return True - ip_helper = IPCommandHelper(ns) - for dev in ip_helper.device_mac_map: - cmd = self.netns_remove_device_str % (ns, dev) - check_call(cmd, shell=True) - self.activate_device(None, dev) - cmd = self.netns_del_str % ns - check_call(cmd, shell=True) - return True - - def add_device(self, ns, device): - if ns is None: - return True - cmd = self.netns_add_device_str % (device, ns) - check_call(cmd, shell=True) - return True - - def config_ip(self, ns, device, ip): - self.activate_device(ns, device) - cmd = self.set_link_addr_str % (ip, device) - cmd = ns_cmd(ns, cmd) - check_call(cmd, shell=True) - return True - - def activate_device(self, ns, device): - cmd = self.set_link_up_str % device - cmd = ns_cmd(ns, cmd) - check_call(cmd, shell=True) - return True - - -class NetnsManager(object): - - def __init__(self): - super(NetnsManager, self).__init__() - self._netns = Netns() - - def config_dev(self, netdev): - ns, device, ip = netdev["namespace"], netdev["iface"], netdev[ - 'ip_setting'] if "ip_setting" in netdev else netdev['ip'] - self._netns.create_namespace(ns) - self._netns.add_device(ns, device) - self._netns.config_ip(ns, device, ip) - my_sleep(1) - ethtool.autoneg_off(device, ns) - return True - - def recover_dev(self, netdev): - ns = netdev["namespace"] - return self._netns.remove_namespace(ns) - - def clean_all_namespace(self): - return self._netns.clean_all_namespace() - - @staticmethod - def ping(ns, ip): - cmd = "ping -w2 -c1 %s" % ip - cmd = ns_cmd(ns, cmd) - child = my_popen(cmd, shell=True) - return 0 == child.wait() - - -if __name__ == '__main__': - logging.basicConfig(level=logging.DEBUG) diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/perf/netperf.py b/testsuites/vstf/vstf_scripts/vstf/agent/perf/netperf.py deleted file mode 100644 index dac7d649..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/agent/perf/netperf.py +++ /dev/null @@ -1,191 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -import time -import subprocess -import vstf.common.constants as cst -import vstf.common.decorator as deco -from vstf.common import perfmark as mark -from vstf.common.utils import kill_by_name, my_popen - -import logging - -LOG = logging.getLogger(__name__) - - -class Netperf(object): - - def __init__(self): - self._send_processes = [] - self._islat = False - self._typemap = { - "tcp_lat": "TCP_STREAM", - "tcp_bw": "TCP_STREAM", - "udp_lat": "UDP_STREAM", - "udp_bw": "UDP_STREAM", - } - - @deco.check("protocol", choices=cst.PROTOCOLS) - @deco.check("namespace", defaults=None) - @deco.check("dst") - @deco.check("time", defaults=0) - @deco.check("size", defaults=64) - @deco.check("threads", defaults=1) - def send_start(self, **kwargs): - threads = kwargs.pop('threads') - kwargs['buf'] = cst.SOCKET_BUF - if kwargs['protocol'] in ['tcp_lat', 'udp_lat']: - self._islat = True - else: - kwargs['time'] = 0 - - cmd = self.format_send_start(**kwargs) - LOG.info("cmd:%s", cmd) - - for _ in range(threads): - process = my_popen( - cmd.split(), - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - self._send_processes.append(process) - time.sleep(0.5) - for process in self._send_processes: - ret = process.poll() - if ret is None: - ret = 0 - error_str = "start netperf send success" - else: - error_str = "start netperf send failed, %s" % (str(kwargs)) - process.wait() - self._send_processes.remove(process) - - return ret, error_str - - def send_stop(self, **kwargs): - LOG.info("send_stop") - results = [] - ret = 0 - for process in self._send_processes: - poll = process.poll() - if poll is None: - if not self._islat: - process.kill() - read = "process is stopped by killed" - else: - ret = process.wait() - read = process.stdout.read() - read = self._parse_data(read) - results.append((ret, read)) - self._send_processes = [] - self._islat = False - return results - - @staticmethod - def _parse_data(data): - buf = data.splitlines() - data = buf[2].strip().split(',') - result = { - mark.minLatency: float(data[0]), - mark.avgLatency: float(data[1]), - mark.maxLatency: float(data[2]) - } - return result - - @deco.namespace() - def format_send_start(self, **kwargs): - # cmd = "netperf -H %(dst_ip)s -t %(type)s -l %(time)s -- -m %(pkt_size)s " - cmd = "netperf -H %(dst_ip)s -t %(type)s -l %(time)s " \ - "-- -m %(pkt_size)s -s %(buf)s -S %(buf)s -o MIN_LATENCY,MEAN_LATENCY,MAX_LATENCY" - context = { - 'dst_ip': kwargs['dst'][0]['ip'], - 'type': self._typemap[kwargs['protocol']], - 'time': kwargs['time'], - 'pkt_size': kwargs['size'], - 'buf': kwargs['buf'], - } - cmd = cmd % context - return cmd - - @deco.namespace() - def format_receive_start(self, **kwargs): - cmd = 'netserver' - return cmd - - @deco.check("namespace") - def receive_start(self, **kwargs): - - cmd = self.format_receive_start(**kwargs) - LOG.info("cmd:%s", cmd) - - process = my_popen( - cmd.split(), - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - time.sleep(0.5) - ret = process.poll() - if ret: - error_str = "start netserver failed, %s" % (str(kwargs)) - else: - ret = 0 - error_str = "start netserver success" - - return ret, error_str - - def receive_stop(self, **kwargs): - LOG.info("receive_stop") - ret = 0 - kill_by_name('netserver') - time.sleep(0.5) - error_str = "stop netserver success" - return ret, error_str - - def clean(self): - self.send_stop() - self.receive_stop() - return True - - def force_clean(self): - LOG.info("%s %s start", self.__class__, self.force_clean.__name__) - kill_by_name('netserver') - kill_by_name('netperf') - self._send_processes = [] - self._receive_processes = [] - return True - - -def unit_test(): - perf = Netperf() - ret = perf.receive_start(namespace='receive') - print "*********receive_start***********" - print ret - send = { - "namespace": "send", - "protocol": "udp_lat", - "dst": [ - {"ip": "192.168.1.102"} - ], - "size": 64, - "threads": 1, - "time": 10, - } - print perf.send_start(**send) - print perf._send_processes - time.sleep(10) - print perf.send_stop() - print perf.receive_stop() - - -if __name__ == "__main__": - from vstf.common.log import setup_logging - - setup_logging( - level=logging.DEBUG, - log_file="/var/log/vstf/vstf-netperf.log", - clevel=logging.DEBUG) - unit_test() diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/perf/pktgen.py b/testsuites/vstf/vstf_scripts/vstf/agent/perf/pktgen.py deleted file mode 100644 index 9aff0a0c..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/agent/perf/pktgen.py +++ /dev/null @@ -1,162 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -import subprocess -import time -import logging -import vstf.agent.perf.utils as utils -import vstf.common.decorator as deco -from vstf.common.utils import my_popen - -LOG = logging.getLogger(__name__) - - -class Pktgen(object): - - def __init__(self): - utils.modprobe_pktgen() - self._send_processes = [] - - def _psetpg(self, dev): - self._dev = dev - - def _vsetpg(self, key, value=''): - with open(self._dev, 'w') as f: - txt = "%(key)s %(value)s\n" % {'key': key, 'value': value} - f.write(txt) - LOG.info("write(%s) to %s", txt.strip(), self._dev) - - def _start(self): - cmd = 'echo start > /proc/net/pktgen/pgctrl' - process = my_popen( - cmd, - shell=True, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - LOG.info('running pid:%s', process.pid) - time.sleep(0.5) - ret = process.poll() - if ret is None: - ret = 0 - self._send_processes.append(process) - error_str = "start pktgen send success" - else: - error_str = "start pktgen send failed, stdout:%s,stderr:%s" % ( - process.stdout.read(), process.stderr.read()) - LOG.info(error_str) - return ret, error_str - - def _rem_device_all(self): - cpu_num = utils.get_cpu_num() - for thread in range(0, cpu_num - 1): - self._psetpg("/proc/net/pktgen/kpktgend_%s" % thread) - self._vsetpg('rem_device_all') - return True - - @deco.check("protocol", choices=['udp_bw'], defaults='udp_bw') - @deco.check("namespace", defaults=None) - @deco.check("dst") - @deco.check("src") - @deco.check("size", defaults=64) - @deco.check("threads", defaults=utils.get_default_threads()) - @deco.check("clone_skb", defaults=1) - @deco.check("count", defaults=0) - @deco.check("ratep", defaults=0) - def send_start(self, **kwargs): - # ensure that all sends is exit - self.send_stop() - - interface_num = len(kwargs['src']) - interfaces = [] - for i in range(interface_num): - device = kwargs['src'][i]['iface'] - interfaces.append(device) - utils.iface_up(device) - - self._rem_device_all() - - threads = kwargs['threads'] - for i in range(interface_num): - dev_min = i * threads - dev_max = (i + 1) * threads - device = interfaces[i] - for dev_id in range(dev_min, dev_max): - queue_id = dev_id % threads - self._psetpg("/proc/net/pktgen/kpktgend_%s" % dev_id) - self._vsetpg('add_device', "%s@%s" % (device, queue_id)) - self._psetpg("/proc/net/pktgen/%s@%s" % (device, queue_id)) - self._vsetpg('pkt_size', kwargs['size']) - self._vsetpg('clone_skb', kwargs['clone_skb']) - self._vsetpg('dst_mac', kwargs['dst'][i]['mac']) - self._vsetpg('src_mac', kwargs['src'][i]['mac']) - self._vsetpg('count', kwargs['count']) - if kwargs['ratep']: - self._vsetpg('ratep', kwargs['ratep']) - return self._start() - - def send_stop(self, **kwargs): - results = [] - ret = 0 - for process in self._send_processes: - process.kill() - process.wait() - LOG.info("process.kill(pktgen:%s)", process.pid) - results.append((ret, process.stdout.read())) - self._send_processes = [] - return results - - def receive_start(self, **kwargs): - ret = 0 - error_str = "%s pktgen neednt receive start" % (self.__class__) - LOG.debug(error_str) - return ret, error_str - - def receive_stop(self, **kwargs): - ret = 0 - error_str = "pktgen neednt receive stop" - LOG.debug(error_str) - return ret, error_str - - def clean(self): - self.send_stop() - return True - - def force_clean(self): - LOG.info("%s %s start", self.__class__, self.force_clean.__name__) - return self.clean() - - -def unit_test(): - perf = Pktgen() - print perf.receive_start() - send = { - "src": [ - {"iface": 'eth4', "mac": "90:e2:ba:20:1f:d8"} - ], - "dst": [ - {"mac": '90:e2:ba:20:1f:d9'} - ], - "size": 64, - "threads": 1, - 'ratep': 0 - } - print perf.send_start(**send) - time.sleep(30) - print perf.send_stop() - print perf.receive_stop() - - -if __name__ == "__main__": - from vstf.common.log import setup_logging - - setup_logging( - level=logging.DEBUG, - log_file="/var/log/vstf/vstf-pktgen.log", - clevel=logging.DEBUG) - unit_test() diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/perf/qperf.py b/testsuites/vstf/vstf_scripts/vstf/agent/perf/qperf.py deleted file mode 100644 index 25272d89..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/agent/perf/qperf.py +++ /dev/null @@ -1,177 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -import subprocess -import time -import logging -import vstf.common.decorator as deco -from vstf.common import perfmark as mark -from vstf.common.utils import kill_by_name, my_popen - -LOG = logging.getLogger(__name__) - - -class Qperf(object): - - def __init__(self): - self._send_processes = [] - self._receive_processes = [] - - @deco.check("protocol", choices=['tcp_lat', 'udp_lat']) - @deco.check("namespace", defaults=None) - @deco.check("dst") - @deco.check("time", defaults=10) - @deco.check("size", defaults=64) - def send_start(self, **kwargs): - cmd = self.format_send_start(**kwargs) - LOG.info("cmd:%s", cmd) - process = my_popen( - cmd.split(), - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - time.sleep(0.5) - ret = process.poll() - if ret is None: - ret = 0 - error_str = "start qperf send success" - self._send_processes.append(process) - else: - print ret - error_str = "start qperf send failed, %s" % (str(kwargs)) - process.wait() - - return ret, error_str - - @deco.namespace() - def format_send_start(self, **kwargs): - cmd = "qperf %(dst_ip)s -t %(time)s -m %(pkt_size)s -vu %(type)s " - context = { - 'dst_ip': kwargs['dst'][0]['ip'], - 'type': kwargs['protocol'], - 'time': kwargs['time'], - 'pkt_size': kwargs['size'], - } - cmd = cmd % context - return cmd - - def send_stop(self, **kwargs): - results = [] - for process in self._send_processes: - process.wait() - read = process.stdout.read() - read = self._parse_data(read) - ret = 0 - results.append((ret, read)) - self._send_processes = [] - return results - - @deco.namespace() - def format_receive_start(self, **kwargs): - cmd = 'qperf' - return cmd - - def receive_start(self, **kwargs): - cmd = self.format_receive_start(**kwargs) - LOG.info("cmd:%s", cmd) - - process = my_popen( - cmd.split(), - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - time.sleep(0.5) - ret = process.poll() - if ret is None: - ret = 0 - error_str = "start qperf receive success" - self._receive_processes.append(process) - else: - print ret - error_str = "start qperf receive failed, %s" % (str(kwargs)) - process.wait() - raise Exception(error_str) - return ret, error_str - - def receive_stop(self, **kwargs): - ret = 0 - for process in self._receive_processes: - process.kill() - process.wait() - self._receive_processes = [] - error_str = "stop qperf receive success" - return ret, error_str - - def receive_kill(self): - kill_by_name('qperf') - self._receive_processes = [] - return True - - def clean(self): - for process in self._receive_processes: - process.kill() - process.wait() - LOG.info("process.kill(qperf daemon:%s)", process.pid) - for process in self._send_processes: - LOG.info("process.wait(qperf client:%s)", process.pid) - process.wait() - self._receive_processes = [] - self._send_processes = [] - return True - - def force_clean(self): - LOG.info("%s %s start", self.__class__, self.force_clean.__name__) - kill_by_name('qperf') - self._send_processes = [] - self._receive_processes = [] - return True - - def _parse_data(self, data): - LOG.info(data) - latency = 0 - if data: - buf = data.splitlines() - if "latency" in buf[1]: - data = buf[1].strip().split() - if data[3] == "us": - latency = float(data[2]) / 1000 - else: - latency = float(data[2]) - result = { - mark.minLatency: latency, - mark.avgLatency: latency, - mark.maxLatency: latency - } - return result - - -def unit_test(): - perf = Qperf() - perf.receive_start(namespace='receive') - - send = { - "namespace": "send", - "protocol": "udp_lat", - "dst": [ - {"ip": "192.168.1.102"} - ], - "size": 64, - } - print perf.send_start(**send) - time.sleep(10) - print perf.send_stop() - print perf.receive_stop() - - -if __name__ == "__main__": - from vstf.common.log import setup_logging - - setup_logging( - level=logging.DEBUG, - log_file="/var/log/vstf/vstf-qperf.log", - clevel=logging.DEBUG) - unit_test() diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/perf/sar.py b/testsuites/vstf/vstf_scripts/vstf/agent/perf/sar.py deleted file mode 100644 index 72d0082d..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/agent/perf/sar.py +++ /dev/null @@ -1,88 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -import subprocess -import logging -import time -import os -from signal import SIGINT - -from vstf.common.utils import check_output, my_popen, kill_by_name -from vstf.agent.env.basic import collect - -LOG = logging.getLogger(__name__) - - -class Sar(object): - - def __init__(self): - self.sar_cmd_str = "sar -u %(interval)s" - self.child_process = {} - - def start(self, interval=2): - cmd = self.sar_cmd_str % {'interval': interval} - child = my_popen( - cmd.split(), - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - time.sleep(1) - if child.poll() is not None: - print child.poll() - raise Exception("start vnstat error, vnstat is not running") - self.child_process[child.pid] = child - return child.pid - - def stop(self, pid): - assert pid in self.child_process - os.kill(pid, SIGINT) - process = self.child_process.pop(pid) - out = process.stdout.read() - process.wait() - data = {'raw_data': out, 'tool': 'sar', 'type': 'cpu'} - cpu_info = collect.Collect().collect_host_info()[1] - cpu_num = cpu_info['CPU INFO']['CPU(s)'] - cpu_mhz = cpu_info['CPU INFO']['CPU MHz'] - data.update({'cpu_num': float(cpu_num), 'cpu_mhz': float(cpu_mhz)}) - return data - - def process(self, raw): - lines = raw.splitlines() - # print lines - head = lines[2].split()[3:] - average = lines[-1].split()[2:] - data = {} - for h, d in zip(head, average): - data[h.strip('%')] = float(d) - cpu_num = check_output( - 'cat /proc/cpuinfo | grep processor | wc -l', - shell=True).strip() - data.update({'cpu_num': int(cpu_num)}) - return data - - def clean(self): - for _, process in self.child_process.items(): - process.kill() - process.wait() - self.child_process = {} - return True - - def force_clean(self): - LOG.info("%s %s start", self.__class__, self.force_clean.__name__) - kill_by_name("sar") - self.child_process = {} - return True - -if __name__ == '__main__': - logging.basicConfig(level=logging.DEBUG) - q = Sar() - pid = q.start() - time.sleep(10) - raw = q.stop(pid) - print raw - print q.process(raw['raw_data']) diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/perf/utils.py b/testsuites/vstf/vstf_scripts/vstf/agent/perf/utils.py deleted file mode 100644 index f9ca46cd..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/agent/perf/utils.py +++ /dev/null @@ -1,48 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -import logging -import subprocess -from vstf.common.utils import check_call, check_output - -LOG = logging.getLogger(__name__) - - -def get_pid_by_name(process_name): - out = check_output(['ps', '-A']) - pids = [] - for line in out.splitlines(): - values = line.split() - pid, name = values[0], values[3] - if process_name == name: - pids.append(int(pid)) - return pids - - -def get_cpu_num(): - cpu_num = check_output( - 'cat /proc/cpuinfo | grep processor | wc -l', - shell=True).strip() - cpu_num = int(cpu_num) - return cpu_num - - -def get_default_threads(): - cpu_num = get_cpu_num() - return 2 if cpu_num > 3 * 3 else 1 - - -def modprobe_pktgen(): - check_call('modprobe pktgen', shell=True) - return True - - -def iface_up(device): - check_call("ifconfig %s up" % device, shell=True) - return True diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/perf/vnstat.py b/testsuites/vstf/vstf_scripts/vstf/agent/perf/vnstat.py deleted file mode 100644 index 49e4f0c1..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/agent/perf/vnstat.py +++ /dev/null @@ -1,113 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -import subprocess -import time -import re -from signal import SIGINT -import os -import logging -from vstf.common.utils import check_call, my_popen, kill_by_name - -LOG = logging.getLogger(__name__) - - -class VnStat(object): - - def __init__(self): - self.netns_exec_str = "ip netns exec %s " - self.vnstat_cmd_str = "vnstat -l -i %s" - self.child_process = {} - - def run_vnstat(self, device, namespace=None): - cmd = self.vnstat_cmd_str - if namespace: - cmd1 = (self.netns_exec_str + "ifconfig %s") % (namespace, device) - check_call(cmd1, shell=True) - cmd = self.netns_exec_str + cmd - cmd = cmd % (namespace, device) - else: - cmd = cmd % device - check_call("which vnstat", shell=True) - child = my_popen(cmd.split(), stdout=subprocess.PIPE) - self.child_process[child.pid] = child - return child.pid - - def kill_vnstat(self, pid, namespace=None): - assert pid in self.child_process - os.kill(pid, SIGINT) - process = self.child_process.pop(pid) - out = process.stdout.read() - process.wait() - LOG.info("os.kill(pid = %s)", pid) - data = {'tool': 'vnstat', 'type': 'nic', 'raw_data': out} - return data - - def clean(self): - for _, process in self.child_process.items(): - process.kill() - process.wait() - LOG.info("process.kill(vnstat:%s)", process.pid) - self.child_process = {} - return True - - def process(self, raw): - buf = raw.splitlines() - buf = buf[9:] - buf = ' '.join(buf) - m = {} - - digits = re.compile(r"\d+\.?\d*") - units = re.compile( - "(?:gib|mib|kib|kbit/s|gbits/s|mbit/s|p/s)", - re.IGNORECASE | re.MULTILINE) - units_arr = units.findall(buf) - - LOG.debug(units_arr) - - digits_arr = digits.findall(buf) - - for i in range(len(digits_arr)): - digits_arr[i] = round(float(digits_arr[i]), 2) - - m['rxpck'], m['txpck'] = digits_arr[8], digits_arr[9] - m['time'] = digits_arr[-1] - digits_arr = digits_arr[:8] + digits_arr[10:-1] - index = 0 - for unit in units_arr: - unit = unit.lower() - if unit == 'gib': - digits_arr[index] *= 1024 - elif unit == 'kib': - digits_arr[index] /= 1024 - elif unit == 'gbit/s': - digits_arr[index] *= 1000 - elif unit == 'kbit/s': - digits_arr[index] /= 1000 - else: - pass - index += 1 - - for i in range(len(digits_arr)): - digits_arr[i] = round(digits_arr[i], 2) - - m['rxmB'], m['txmB'] = digits_arr[0:2] - m['rxmB_max/s'], m['txmB_max/s'] = digits_arr[2:4] - m['rxmB/s'], m['txmB/s'] = digits_arr[4:6] - m['rxmB_min/s'], m['txmB_min/s'] = digits_arr[6:8] - m['rxpck_max/s'], m['txpck_max/s'] = digits_arr[8:10] - m['rxpck/s'], m['txpck/s'] = digits_arr[10:12] - m['rxpck_min/s'], m['txpck_min/s'] = digits_arr[12:14] - return m - - def force_clean(self): - LOG.info("%s %s start", self.__class__, self.force_clean.__name__) - kill_by_name("vnstat") - self.child_process = {} - return True diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/perf/vstfperf.py b/testsuites/vstf/vstf_scripts/vstf/agent/perf/vstfperf.py deleted file mode 100644 index 939b12ef..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/agent/perf/vstfperf.py +++ /dev/null @@ -1,111 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -__doc__ = """ -operation: [start, stop, restart] -action: [send, receive] -tool: [pktgen, netperf, qperf, iperf, netmap] -params: - protocol: [tcp_lat, udp_lat, tcp_bw, udp_bw] - namespace: None - src:[ - { "iface":"eth0", "ip":"xxx.xxx.xxx.xxx", "mac":"FF:FF:FF:FF:FF:FF"} - ] - dst:[ - { "iface":"eth0", "ip":"xxx.xxx.xxx.xxx", "mac":"FF:FF:FF:FF:FF:FF"} - ] - size: 64 - threads: 1 - ratep: 100000 (pps) - time: 100 (s) -""" - -import sys -import logging -import vstf.common.constants as cst -import vstf.common.decorator as deco -import vstf.agent.perf.pktgen as vstf_pktgen -import vstf.agent.perf.netmap as vstf_netmap -import vstf.agent.perf.qperf as vstf_qperf -import vstf.agent.perf.iperf as vstf_iperf -import vstf.agent.perf.netperf as vstf_netperf - -LOG = logging.getLogger(__name__) - - -class Vstfperf(object): - - def __init__(self): - for tool in cst.TOOLS: - obj_name = 'vstf_' + tool - obj = getattr(sys.modules[__name__], obj_name) - cls_name = tool.title() - cls = getattr(obj, tool.title()) - self.__dict__.update({tool: cls()}) - - @deco.check("operation", choices=cst.OPERATIONS) - @deco.check("action", choices=cst.ACTIONS) - @deco.check("tool", choices=cst.TOOLS) - @deco.check("params", defaults={}) - def run(self, **kwargs): - print "_run in" - operation = kwargs.pop("operation") - tool = kwargs.pop("tool") - instance = getattr(self, tool) - action = kwargs.pop("action") - func_name = "%s_%s" % (action, operation) - func = getattr(instance, func_name) - LOG.info(kwargs['params']) - LOG.info(func) - ret = func(**kwargs['params']) - return ret - - def force_clean(self): - LOG.info("%s %s start", self.__class__, self.force_clean.__name__) - for tool in cst.TOOLS: - instance = getattr(self, tool) - instance.force_clean() - return True - - -def unit_test(): - from vstf.common.log import setup_logging - setup_logging( - level=logging.DEBUG, - log_file="/var/log/vstf/vstf-vstfperf.log", - clevel=logging.INFO) - - perf = Vstfperf() - start = { - "operation": "start", - "action": "send", - "tool": "netperf", - "params": { - "namespace": "vnet_name1", - "protocol": "udp_lat", - "dst": [ - {"ip": "192.168.1.102"} - ], - "size": 64, - "threads": 1, - "time": 100, - }, - } - perf.run(**start) - - stop = { - "operation": "stop", - "action": "send", - "tool": "netperf", - } - perf.run(**stop) - - -if __name__ == '__main__': - unit_test() diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/softagent.py b/testsuites/vstf/vstf_scripts/vstf/agent/softagent.py deleted file mode 100644 index 9ba1e126..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/agent/softagent.py +++ /dev/null @@ -1,139 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - - -import logging -import time -from vstf.agent.env.basic.image_manager import ImageManager -from vstf.agent.env.basic.source_manager import SourceCodeManager -from vstf.agent.env.basic import commandline -from vstf.agent.env.basic.device_manager import DeviceManager -from vstf.agent.env.basic import collect as coll -from vstf.agent.perf import netns, vnstat, vstfperf, sar, ethtool, affctl -from vstf.agent.env import builder -from vstf.agent.equalizer.get_info import GetPhyInfo -from vstf.agent.equalizer.optimize import Optimize -from vstf.agent.env.driver_plugins.manager import DriverPluginManager - -LOG = logging.getLogger(__name__) - - -class ENV(object): - - def __init__(self): - super(ENV, self).__init__() - self.builder = builder.PluginManager() - - def build_env(self, cfg_intent): - return self.builder.build(cfg_intent) - - def clean_env(self): - return self.builder.clean() - - @staticmethod - def create_images(cfg): - return ImageManager(cfg).create_all() - - @staticmethod - def clean_images(cfg): - return ImageManager(cfg).clean_all() - - -class Drivers(object): - - def __init__(self): - super(Drivers, self).__init__() - self.dr_mgr = DriverPluginManager() - - def install_drivers(self, drivers): - LOG.info("install drivers:%s", drivers) - self.dr_mgr.clean() - ret = self.dr_mgr.load(drivers) - return ret - - def clean_drivers(self): - return self.dr_mgr.clean() - - def autoneg_on(self, iface, nspace): - return ethtool.autoneg_on(iface, nspace) - - def autoneg_off(self, iface, nspace): - return ethtool.autoneg_off(iface, nspace) - - def autoneg_query(self, iface, nspace): - return ethtool.autoneg_query(iface, nspace) - - -class Cpu(object): - - def affctl_load(self, policy): - return affctl.affctl_load(policy) - - def affctl_list(self): - return affctl.affctl_list() - - -class Perf(object): - - def __init__(self): - super(Perf, self).__init__() - self._vnstat = vnstat.VnStat() - self._vstfperf = vstfperf.Vstfperf() - self._sar = sar.Sar() - - def run_vnstat(self, device, namespace=None): - return self._vnstat.run_vnstat(device, namespace) - - def kill_vnstat(self, pid, namespace=None): - return self._vnstat.kill_vnstat(pid, namespace) - - def perf_run(self, **kwargs): - return self._vstfperf.run(**kwargs) - - def run_cpuwatch(self, interval=2): - return self._sar.start(interval) - - def kill_cpuwatch(self, pid): - return self._sar.stop(pid) - - def force_clean(self): - self._vstfperf.force_clean() - self._sar.force_clean() - self._vnstat.force_clean() - return True - - -class EqualizerOps(GetPhyInfo, Optimize): - - def __init__(self): - super(EqualizerOps, self).__init__() - - -class BaseAgent(coll.Collect, - ENV, - Cpu, - Drivers, - DeviceManager, - commandline.CommandLine, - netns.NetnsManager, - SourceCodeManager - ): - - def __init__(self): - super(BaseAgent, self).__init__() - - -class softAgent(BaseAgent, Perf, EqualizerOps): - - def __init__(self): - super(softAgent, self).__init__() - - -if __name__ == '__main__': - softAgent() diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/spirent/__init__.py b/testsuites/vstf/vstf_scripts/vstf/agent/spirent/__init__.py deleted file mode 100644 index 83b8d15d..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/agent/spirent/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/spirent/spirent.py b/testsuites/vstf/vstf_scripts/vstf/agent/spirent/spirent.py deleted file mode 100644 index ff2af1f8..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/agent/spirent/spirent.py +++ /dev/null @@ -1,334 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - - -import Tkinter - - -def build_cmd(*args): - cmd = '' - for arg in args: - cmd = cmd + str(arg) + ' ' - #import pdb - # pdb.set_trace() - return cmd - - -class stcPython(): - - def __init__(self): - self.tclsh = Tkinter.Tcl() - self.stcpkg = '/home/Spirent_TestCenter_4.46/Spirent_TestCenter_Application_Linux' - self.tclsh.eval( - "set auto_path [ linsert $auto_path 0 %s ]" % - (self.stcpkg)) - self.tclsh.eval("package require SpirentTestCenter") - - def build_cmd(self, *args): - cmd = '' - for arg in args: - cmd = cmd + str(arg) + ' ' - return cmd - - # [ stc base interface ] - def stc_init(self, *args): - cmd = build_cmd('stc::init', *args) - return self.tclsh.eval(cmd) - # stc connect - - def stc_connect(self, *args): - cmd = build_cmd('stc::connect', *args) - return self.tclsh.eval(cmd) - # stc disconnect - - def stc_disconnect(self, *args): - cmd = build_cmd('stc::disconnect', *args) - return self.tclsh.eval(cmd) - # stc create - - def stc_create(self, *args): - cmd = build_cmd('stc::create', *args) - return self.tclsh.eval(cmd) - # stc delete - - def stc_delete(self, *args): - cmd = build_cmd('stc::delete', *args) - return self.tclsh.eval(cmd) - # stc config - - def stc_config(self, *args): - cmd = build_cmd('stc::config', *args) - return self.tclsh.eval(cmd) - # stc get - - def stc_get(self, *args): - cmd = build_cmd('stc::get', *args) - return self.tclsh.eval(cmd) - # stc apply - - def stc_apply(self, *args): - cmd = build_cmd('stc::apply', *args) - return self.tclsh.eval(cmd) - # stc perform - - def stc_perform(self, *args): - cmd = build_cmd('stc::perform', *args) - return self.tclsh.eval(cmd) - # stc reserve - - def stc_reserve(self, *args): - cmd = build_cmd('stc::reserve', *args) - return self.tclsh.eval(cmd) - # stc release - - def stc_release(self, *args): - cmd = build_cmd('stc::release', *args) - return self.tclsh.eval(cmd) - # stc subscribe - - def stc_subscribe(self, *args): - cmd = build_cmd('stc::subscribe', *args) - return self.tclsh.eval(cmd) - # stc unsubscribe - - def stc_unsubscribe(self, *args): - cmd = build_cmd('stc::unsubscribe', *args) - return self.tclsh.eval(cmd) - # stc wait until sequencer complete - - def stc_waituntilcomplete(self, *args): - cmd = build_cmd('stc::waituntilcomplete', *args) - return self.tclsh.eval(cmd) - # stc help - - def stc_help(self, *args): - cmd = build_cmd('stc::help', *args) - return self.tclsh.eval(cmd) - - # [ stc expand interface ] - # get one dict-key's value - # return value - def stc_get_value(self, stc_dict, stc_key): - cmd = stc_dict + ' -' + stc_key - return self.stc_get(cmd) - # create project - # return: project_name - - def stc_create_project(self): - return self.stc_create('project') - # create port under project - # return: port name - - def stc_create_port(self, project_name): - cmd = 'port -under ' + project_name - return self.stc_create(cmd) - # config port location - # return: None - - def stc_config_port_location(self, port_name, chassisAddress, slot, port): - #import pdb - # pdb.set_trace() - cmd = port_name + ' -location //' + chassisAddress + \ - '/' + slot + '/' + port + ' -UseDefaultHost False' - return self.stc_config(cmd) - # create streamblock under port - # return: streamblock name - - def stc_create_streamblock( - self, - port_name, - vlan_tag, - ExpectedRxPort, - srcMac, - dstMac, - sourceAddr, - destAddr): - #import pdb - # pdb.set_trace() - if vlan_tag is None or vlan_tag == 'None': - frameStruc = '"EthernetII IPv4 Udp"' - if ExpectedRxPort == '': - return self.stc_create( - 'streamBlock -under ', - port_name, - '-frameConfig ', - frameStruc, - '-frame "EthernetII.srcMac', - srcMac, - 'EthernetII.dstMac', - dstMac, - 'IPv4.1.sourceAddr', - sourceAddr, - 'IPv4.1.destAddr', - destAddr, - '"') - else: - return self.stc_create( - 'streamBlock -under ', - port_name, - '-ExpectedRxPort', - ExpectedRxPort, - '-frameConfig ', - frameStruc, - '-frame "EthernetII.srcMac', - srcMac, - 'EthernetII.dstMac', - dstMac, - 'IPv4.1.sourceAddr', - sourceAddr, - 'IPv4.1.destAddr', - destAddr, - '"') - else: - frameStruc = '"EthernetII Vlan IPv4 Udp"' - if ExpectedRxPort == '': - return self.stc_create( - 'streamBlock -under ', - port_name, - '-frameConfig ' + - frameStruc, - '-frame "EthernetII.srcMac', - srcMac, - 'EthernetII.dstMac', - dstMac, - 'Vlan.1.id', - vlan_tag, - 'IPv4.1.sourceAddr', - sourceAddr, - 'IPv4.1.destAddr', - destAddr, - '"') - else: - return self.stc_create( - 'streamBlock -under ', - port_name, - '-ExpectedRxPort', - ExpectedRxPort, - '-frameConfig ' + - frameStruc, - '-frame "EthernetII.srcMac', - srcMac, - 'EthernetII.dstMac', - dstMac, - 'Vlan.1.id', - vlan_tag, - 'IPv4.1.sourceAddr', - sourceAddr, - 'IPv4.1.destAddr', - destAddr, - '"') - # config streamblock with part arguments - # argument list use args dictionary - - def stc_config_streamblock(self, streamblock_name, args_dict): - cmd = '' - for key in args_dict.keys(): - temp_cmd = '-' + key + ' ' + str(args_dict[key]) - cmd = cmd + temp_cmd - return self.stc_config(streamblock_name, cmd) - # get generator name from port name - # return: generator name - - def stc_get_generator(self, port_name): - cmd = port_name + ' -children-generator' - return self.stc_get(cmd) - # config generator with part arguments - # argument list use args dictionary - # return none - - def stc_config_generator(self, generator_name, args_dict): - cmd = '' - for key in args_dict.keys(): - temp_cmd = '-' + key + ' ' + str(args_dict[key]) - cmd = cmd + temp_cmd - return self.stc_config(generator_name, cmd) - # attach port - # return: port's parent project info - - def stc_attach_ports(self, portList): - cmd = 'AttachPorts -portList {' - for port in portList: - cmd = cmd + ' ' + port - cmd = cmd + '} -autoConnect TRUE' - return self.stc_perform(cmd) - # config src mac and dst mac - # return: none - - def stc_config_ethII(self, ethII, src_mac, dst_mac): - cmd = ethII + ' -srcMac ' + src_mac + ' -dstMac ' + dst_mac - return self.stc_config(cmd) - # config src ip and dst ip - # return: none - - def stc_config_ethIII(self, ethIII, src_ip, dst_ip): - cmd = ethIII + ' -sourceAddr ' + src_ip + ' -destAddr ' + dst_ip - return self.stc_config(cmd) - # start streamblock - # return: none - - def stc_streamblock_start(self, streamblock_list): - cmd = 'StreamBlockStart -StreamBlockList {' - for streamblock in streamblock_list: - cmd = cmd + ' ' + streamblock - cmd = cmd + ' } -ExecuteSynchronous TRUE' - return self.stc_perform(cmd) - # stop streamblock - - def stc_streamblock_stop(self, streamblock_list): - cmd = 'StreamBlockStop -StreamBlockList {' - for streamblock in streamblock_list: - cmd = cmd + ' ' + streamblock - cmd = cmd + ' } -ExecuteSynchronous TRUE' - return self.stc_perform(cmd) - # start generator - # return: none - - def stc_generator_start(self, generator_List): - cmd = 'GeneratorStart -generatorList {' - for generator in generator_List: - cmd = cmd + ' ' + generator - cmd = cmd + ' }' - return self.stc_perform(cmd) - # stop generator - # return: none - - def stc_generator_stop(self, generator_List): - cmd = 'GeneratorStop -generatorList {' - for generator in generator_List: - cmd = cmd + ' ' + generator - cmd = cmd + ' }' - return self.stc_perform(cmd) - # create rfc2544 throughput test - - def stc_setup_rfc2544_throughput(self): - pass - # create rfc2544 frameloss test - - def stc_setup_rfc2544_frameloss(self): - pass - # create rfc2544 latency test - - def stc_setup_rfc2544_latency(self): - pass - # start Sequence start - - def stc_sequence_start(self): - return self.stc_perform('SequencerStart') - # output rfc2544 throughput result - - def stc_get_rfc2544_throughput_result(self): - pass - # output rfc2544 frameloss result - - def stc_get_rfc2544_frameloss_result(self): - pass - # output rfc2544 latency result - - def stc_get_rfc2544_latency_result(self): - pass diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/spirent/tools.py b/testsuites/vstf/vstf_scripts/vstf/agent/spirent/tools.py deleted file mode 100644 index 0936d39d..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/agent/spirent/tools.py +++ /dev/null @@ -1,386 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - - -import time -from spirent import stcPython - - -class Spirent_Tools(object): - baseAPI = stcPython() - - def __init__(self): - """This class provide API of Spirent - - """ - super(Spirent_Tools, self).__init__() - - def send_packet(self, flow): - try: - #import pdb - # pdb.set_trace() - flow = eval(flow) - # stc init action - self.baseAPI.stc_perform(' ResetConfig -config system1') - self.baseAPI.stc_init() - # create project - project = self.baseAPI.stc_create_project() - # create port - port_handle = self.baseAPI.stc_create_port(project) - # config port - slot = flow['send_port'].split('/')[0] - port = flow['send_port'].split('/')[1] - self.baseAPI.stc_config_port_location( - port_handle, flow['tester_ip'], slot, port) - # create streamblock - streamblock_handle = self.baseAPI.stc_create_streamblock( - port_name=port_handle, - ExpectedRxPort='', - vlan_tag=flow['vlan'], - srcMac=flow['src_mac'], - dstMac=flow['dst_mac'], - sourceAddr=flow['src_ip'], - destAddr=flow['dst_ip'] - ) - # attach port - port_list = [port_handle] - self.baseAPI.stc_attach_ports(port_list) - # start streamblock - streamblock_list = [streamblock_handle] - flag = self.baseAPI.stc_streamblock_start(streamblock_list) - return str(streamblock_list).strip('[]') - except: - print("[ERROR]create stream block and send packet failed.") - return False - - def mac_learning(self, flowA, flowB): - try: - #import pdb - # pdb.set_trace() - flowA = eval(flowA) - flowB = eval(flowB) - port_list = [] - streamblock_list = [] - # stc init action - self.baseAPI.stc_perform(' ResetConfig -config system1') - self.baseAPI.stc_init() - # create project - project = self.baseAPI.stc_create_project() - # create port and config port - for flow in [flowA, flowB]: - flow['port_handle'] = self.baseAPI.stc_create_port(project) - tmp_test_ip = flow['tester_ip'] - tmp_slot = flow['send_port'].split('/')[0] - tmp_port = flow['send_port'].split('/')[1] - self.baseAPI.stc_config_port_location( - flow['port_handle'], tmp_test_ip, tmp_slot, tmp_port) - # create streamblock - flow['streamblock'] = self.baseAPI.stc_create_streamblock( - port_name=flow['port_handle'], - ExpectedRxPort='', - vlan_tag=flow['vlan'], - srcMac=flow['src_mac'], - dstMac=flow['dst_mac'], - sourceAddr=flow['src_ip'], - destAddr=flow['dst_ip']) - # create port and stream block list - port_list.append(flow['port_handle']) - streamblock_list.append(flow['streamblock']) - - # attach port - self.baseAPI.stc_attach_ports(port_list) - # start streamblock - flag = self.baseAPI.stc_streamblock_start(streamblock_list) - # mac learning - time.sleep(2) - # stop stream block - self.baseAPI.stc_streamblock_stop(streamblock_list) - # delete streamblock and release port - for flow in [flowA, flowB]: - tmp_test_ip = flow['tester_ip'] - tmp_slot = flow['send_port'].split('/')[0] - tmp_port = flow['send_port'].split('/')[1] - self.baseAPI.stc_delete(flow['streamblock']) - self.baseAPI.stc_release( - '%s/%s/%s' % - (tmp_test_ip, tmp_slot, tmp_port)) - # delete project - self.baseAPI.stc_delete('project1') - ret = self.baseAPI.stc_perform('ResetConfig -config system1') - return True - except: - print("[ERROR]mac learning failed") - return False - - def stop_flow(self, streamblock_list, flow): - flow = eval(flow) - streamblock_list = streamblock_list.strip('\'').split(',') - # stop streamblock list - try: - ret = self.baseAPI.stc_streamblock_stop(streamblock_list) - except: - print("[ERROR]Stop the streamblock list failed.") - return False - # delete streamblock - try: - for streamblock in streamblock_list: - ret = self.baseAPI.stc_delete(streamblock) - except: - print("[ERROR]delete stream block.") - return False - # release port - try: - slot = flow['send_port'].split('/')[0] - port = flow['send_port'].split('/')[1] - ret = self.baseAPI.stc_release( - '%s/%s/%s' % - (flow['tester_ip'], slot, port)) - except: - print("[ERROR]Release port failed") - return False - # delete project - try: - ret = self.baseAPI.stc_delete('project1') - ret = self.baseAPI.stc_perform('ResetConfig -config system1') - return True - except: - print("[ERROR]Delete project1 failed.") - return False - - def run_rfc2544_throughput(self, forward_init_flows, reverse_init_flows): - #import pdb - # pdb.set_trace() - # rebuild the flows - forward_init_flows = eval(forward_init_flows) - reverse_init_flows = eval(reverse_init_flows) - # stc init action - self.baseAPI.stc_perform(' ResetConfig -config system1') - self.baseAPI.stc_init() - # create project - project = self.baseAPI.stc_create_project() - # create sequencer - seq_handle = self.baseAPI.stc_create('Sequencer -under %s' % (project)) - # create port handle - forward_port_handle = self.baseAPI.stc_create_port(project) - reverse_port_handle = self.baseAPI.stc_create_port(project) - # create forward flow streamblock - for key in forward_init_flows.keys(): - forward_init_flows[key]['port_handle'] = forward_port_handle - tmp_test_ip = forward_init_flows[key]['tester_ip'] - tmp_slot = forward_init_flows[key]['send_port'].split('/')[0] - tmp_port = forward_init_flows[key]['send_port'].split('/')[1] - self.baseAPI.stc_config_port_location( - forward_init_flows[key]['port_handle'], tmp_test_ip, tmp_slot, tmp_port) - # create streamblock - forward_init_flows[key]['streamblock'] = self.baseAPI.stc_create_streamblock( - port_name=forward_init_flows[key]['port_handle'], - vlan_tag=forward_init_flows[key]['vlan'], - ExpectedRxPort=reverse_port_handle, - srcMac=forward_init_flows[key]['src_mac'], - dstMac=forward_init_flows[key]['dst_mac'], - sourceAddr=forward_init_flows[key]['src_ip'], - destAddr=forward_init_flows[key]['dst_ip']) - # create reverse flow streamblock - for key in reverse_init_flows.keys(): - reverse_init_flows[key]['port_handle'] = reverse_port_handle - tmp_test_ip = reverse_init_flows[key]['tester_ip'] - tmp_slot = reverse_init_flows[key]['send_port'].split('/')[0] - tmp_port = reverse_init_flows[key]['send_port'].split('/')[1] - self.baseAPI.stc_config_port_location( - reverse_init_flows[key]['port_handle'], tmp_test_ip, tmp_slot, tmp_port) - # create streamblock - reverse_init_flows[key]['streamblock'] = self.baseAPI.stc_create_streamblock( - port_name=reverse_init_flows[key]['port_handle'], - vlan_tag=reverse_init_flows[key]['vlan'], - ExpectedRxPort=forward_port_handle, - srcMac=reverse_init_flows[key]['src_mac'], - dstMac=reverse_init_flows[key]['dst_mac'], - sourceAddr=reverse_init_flows[key]['src_ip'], - destAddr=reverse_init_flows[key]['dst_ip']) - # Create the RFC 2544 throughput test - throughput_config = self.baseAPI.stc_create( - 'Rfc2544ThroughputConfig -under ', - project, - '-AcceptableFrameLoss 0.01', - '-NumOfTrials 1', - '-DurationSeconds 60', - '-SearchMode BINARY', - '-RateLowerLimit 1', - '-RateUpperLimit 100', - '-RateInitial 10', - '-UseExistingStreamBlocks True', - '-EnableLearning False', - '-FrameSizeIterationMode CUSTOM', - '-CustomFrameSizeList "70 128 256 512 1024 1280 1518"', - '-LatencyType LIFO', - '-EnableJitterMeasurement TRUE') - #import pdb - # pdb.set_trace() - # list streamblocks - streamblock_list = '" ' - for key in forward_init_flows.keys(): - streamblock_list = streamblock_list + \ - forward_init_flows[key]['streamblock'] + ' ' - for key in reverse_init_flows.keys(): - streamblock_list = streamblock_list + \ - reverse_init_flows[key]['streamblock'] + ' ' - streamblock_list = streamblock_list + '"' - - throughput_sbProfile = self.baseAPI.stc_create( - 'Rfc2544StreamBlockProfile -under ' + - throughput_config + - ' -Active TRUE -LocalActive TRUE') - self.baseAPI.stc_config( - throughput_sbProfile, - '-StreamBlockList ' + - streamblock_list) - self.baseAPI.stc_perform( - 'ExpandBenchmarkConfigCommand', - '-config ', - throughput_config) - - # attach the port before testing - port_list = [forward_port_handle, reverse_port_handle] - self.baseAPI.stc_attach_ports(port_list) - - # stc apply and begin to sequence test - self.baseAPI.stc_apply() - self.baseAPI.stc_perform("SequencerStart") - - # wait until complete - self.baseAPI.stc_waituntilcomplete() - - # get result db - resultsdb = self.baseAPI.stc_get( - "system1.project.TestResultSetting", - "-CurrentResultFileName") - results_dict = self.baseAPI.stc_perform( - 'QueryResult', - '-DatabaseConnectionString', - resultsdb, - '-ResultPath RFC2544ThroughputTestResultDetailedSummaryView') - # print results_dict - return True, results_dict - - def run_rfc2544_frameloss(self, forward_init_flows, reverse_init_flows): - #import pdb - # pdb.set_trace() - # rebuild the flows - forward_init_flows = eval(forward_init_flows) - reverse_init_flows = eval(reverse_init_flows) - # stc init action - self.baseAPI.stc_perform(' ResetConfig -config system1') - self.baseAPI.stc_init() - # create project - project = self.baseAPI.stc_create_project() - # create sequencer - seq_handle = self.baseAPI.stc_create('Sequencer -under %s' % (project)) - # create port handle - forward_port_handle = self.baseAPI.stc_create_port(project) - reverse_port_handle = self.baseAPI.stc_create_port(project) - # create forward flow streamblock - for key in forward_init_flows.keys(): - forward_init_flows[key]['port_handle'] = forward_port_handle - tmp_test_ip = forward_init_flows[key]['tester_ip'] - tmp_slot = forward_init_flows[key]['send_port'].split('/')[0] - tmp_port = forward_init_flows[key]['send_port'].split('/')[1] - self.baseAPI.stc_config_port_location( - forward_init_flows[key]['port_handle'], tmp_test_ip, tmp_slot, tmp_port) - # create streamblock - forward_init_flows[key]['streamblock'] = self.baseAPI.stc_create_streamblock( - port_name=forward_init_flows[key]['port_handle'], - vlan_tag=forward_init_flows[key]['vlan'], - ExpectedRxPort=reverse_port_handle, - srcMac=forward_init_flows[key]['src_mac'], - dstMac=forward_init_flows[key]['dst_mac'], - sourceAddr=forward_init_flows[key]['src_ip'], - destAddr=forward_init_flows[key]['dst_ip']) - # create reverse flow streamblock - for key in reverse_init_flows.keys(): - reverse_init_flows[key]['port_handle'] = reverse_port_handle - tmp_test_ip = reverse_init_flows[key]['tester_ip'] - tmp_slot = reverse_init_flows[key]['send_port'].split('/')[0] - tmp_port = reverse_init_flows[key]['send_port'].split('/')[1] - self.baseAPI.stc_config_port_location( - reverse_init_flows[key]['port_handle'], tmp_test_ip, tmp_slot, tmp_port) - # create streamblock - reverse_init_flows[key]['streamblock'] = self.baseAPI.stc_create_streamblock( - port_name=reverse_init_flows[key]['port_handle'], - vlan_tag=reverse_init_flows[key]['vlan'], - ExpectedRxPort=forward_port_handle, - srcMac=reverse_init_flows[key]['src_mac'], - dstMac=reverse_init_flows[key]['dst_mac'], - sourceAddr=reverse_init_flows[key]['src_ip'], - destAddr=reverse_init_flows[key]['dst_ip']) - # Create the RFC 2544 frameloss test - frameloss_config = self.baseAPI.stc_create( - 'Rfc2544FrameLossConfig -under ', - project, - '-NumOfTrials 1 ', - '-DurationSeconds 60 ', - '-LoadUnits PERCENT_LINE_RATE ', - '-LoadType CUSTOM ' - '-CustomLoadList 100 ' - '-UseExistingStreamBlocks True ', - '-EnableLearning False ', - '-FrameSizeIterationMode CUSTOM ', - '-CustomFrameSizeList "70 128 256 512 1024 1280 1518"', - '-LatencyType LIFO', - '-EnableJitterMeasurement TRUE') - #import pdb - # pdb.set_trace() - # list streamblocks - streamblock_list = '" ' - for key in forward_init_flows.keys(): - streamblock_list = streamblock_list + \ - forward_init_flows[key]['streamblock'] + ' ' - for key in reverse_init_flows.keys(): - streamblock_list = streamblock_list + \ - reverse_init_flows[key]['streamblock'] + ' ' - streamblock_list = streamblock_list + '"' - - frameloss_sbProfile = self.baseAPI.stc_create( - 'Rfc2544StreamBlockProfile -under ' + - frameloss_config + - ' -Active TRUE -LocalActive TRUE') - self.baseAPI.stc_config( - frameloss_sbProfile, - '-StreamBlockList ' + - streamblock_list) - self.baseAPI.stc_perform( - 'ExpandBenchmarkConfigCommand', - '-config ', - frameloss_config) - - # attach the port before testing - port_list = [forward_port_handle, reverse_port_handle] - self.baseAPI.stc_attach_ports(port_list) - - # stc apply and begin to sequence test - self.baseAPI.stc_apply() - self.baseAPI.stc_perform("SequencerStart") - - # wait until complete - self.baseAPI.stc_waituntilcomplete() - - # get result db - resultsdb = self.baseAPI.stc_get( - "system1.project.TestResultSetting", - "-CurrentResultFileName") - results_dict = self.baseAPI.stc_perform( - 'QueryResult', - '-DatabaseConnectionString', - resultsdb, - '-ResultPath RFC2544FrameLossTestResultDetailedSummaryView') - #import pdb - # pdb.set_trace() - return True, results_dict - - def run_rfc2544_latency(self, forward_init_flows, reverse_init_flows): - pass diff --git a/testsuites/vstf/vstf_scripts/vstf/agent/spirentagent.py b/testsuites/vstf/vstf_scripts/vstf/agent/spirentagent.py deleted file mode 100644 index 46583dfe..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/agent/spirentagent.py +++ /dev/null @@ -1,17 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - - -from vstf.agent.spirent.tools import Spirent_Tools as Spirent - - -class agentSpirent(Spirent): - - def __init__(self): - super(agentSpirent, self).__init__() diff --git a/testsuites/vstf/vstf_scripts/vstf/common/__init__.py b/testsuites/vstf/vstf_scripts/vstf/common/__init__.py deleted file mode 100644 index 83b8d15d..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/common/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## diff --git a/testsuites/vstf/vstf_scripts/vstf/common/candy_text.py b/testsuites/vstf/vstf_scripts/vstf/common/candy_text.py deleted file mode 100644 index 306d9124..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/common/candy_text.py +++ /dev/null @@ -1,61 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - - -import sys - -THIS = sys.modules[__name__] -__id_max = 100 -__style_max = 10 -dom = {"chapter", "section", "unit"} -element = {"title", "table", "figure", "paragraph", "plot", "chart", "space"} - -nodes = dom | element -for _node in nodes: - setattr(THIS, _node, _node) - - -def tuple2text(sn, node, style): - assert sn in range(__id_max) - assert style in range(__style_max) - assert node in nodes - return "%02d##%s#%d" % (sn, node, style) - - -def dict2text(info): - assert "sn" in info and info["sn"] in range(__id_max) - assert "style" in info and info["style"] in range(__style_max) - assert "node" in info and info["node"] in nodes - return "%02d##%s#%d" % (info["sn"], info["node"], info["style"]) - - -def text2dict(candy): - tmp = candy.replace("##", "#").split("#") - result = { - "sn": int(tmp[0]), - "node": tmp[1], - "style": int(tmp[2]) - } - assert result["sn"] in range(__id_max) - assert result["style"] in range(__style_max) - assert result["node"] in nodes - return result - - -def text2tuple(candy): - tmp = candy.replace("##", "#").split("#") - - sn = int(tmp[0]) - node = tmp[1] - style = int(tmp[2]) - - assert sn in range(__id_max) - assert style in range(__style_max) - assert node in nodes - return sn, node, style diff --git a/testsuites/vstf/vstf_scripts/vstf/common/cfgparser.py b/testsuites/vstf/vstf_scripts/vstf/common/cfgparser.py deleted file mode 100644 index 802cb214..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/common/cfgparser.py +++ /dev/null @@ -1,32 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -import os -from oslo.config import cfg - - -class CfgParser(object): - - def __init__(self, config_file): - super(CfgParser, self).__init__() - if os.path.isfile(config_file) is False: - raise Exception('The config file not found <%s>' % config_file) - self.config_file = config_file - self.CONF = cfg.ConfigOpts() - - def register_my_opts(self, opts, name=None): - if name: - self.CONF.register_opts(opts, name) - else: - self.CONF.register_opts(opts) - - def parse(self): - # self.register_my_opts(opts, name=name) - self.CONF(args=[], default_config_files=[self.config_file]) - return self.CONF diff --git a/testsuites/vstf/vstf_scripts/vstf/common/check.py b/testsuites/vstf/vstf_scripts/vstf/common/check.py deleted file mode 100644 index 2ceddc04..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/common/check.py +++ /dev/null @@ -1,26 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -import logging -import vstf.common.constants as cst - -LOG = logging.getLogger(__name__) - - -def check_case_params(protocol, typ, tool): - if "throughput" == typ: - return False, "Not support 'throughput' at this version" - if "tcp" == protocol: - if tool in ["pktgen", "netmap"]: - return False, "%s cant support tcp test" % tool - if "qperf" == tool and "latency" != typ: - return False, "qperf support latency test only, cant support %s" % typ - if "latency" == typ and tool not in ["netperf", "qperf"]: - return False, "%s cant support latency test" % tool - return True, "support successfully" diff --git a/testsuites/vstf/vstf_scripts/vstf/common/cliutil.py b/testsuites/vstf/vstf_scripts/vstf/common/cliutil.py deleted file mode 100644 index 8997cd6a..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/common/cliutil.py +++ /dev/null @@ -1,37 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - - -def arg(*args, **kwargs): - """Decorator for CLI args. - - Example: - - >>> @arg("name", help="Name of the new entity") - ... def entity_create(args): - ... pass - """ - def _decorator(func): - add_arg(func, *args, **kwargs) - return func - return _decorator - - -def add_arg(func, *args, **kwargs): - """Bind CLI arguments to a shell.py `do_foo` function.""" - - if not hasattr(func, 'arguments'): - func.arguments = [] - - # NOTE(sirp): avoid dups that can occur when the module is shared across - # tests. - if (args, kwargs) not in func.arguments: - # Because of the semantics of decorator composition if we just append - # to the options list positional options will appear to be backwards. - func.arguments.insert(0, (args, kwargs)) diff --git a/testsuites/vstf/vstf_scripts/vstf/common/cmds.py b/testsuites/vstf/vstf_scripts/vstf/common/cmds.py deleted file mode 100644 index f348a804..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/common/cmds.py +++ /dev/null @@ -1,30 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -import commands -import logging - -LOG = logging.getLogger(__name__) - - -def execute(cmd=None, care_result=True): - if not cmd: - LOG.error('The cmd is None') - return None - try: - (status, ret) = commands.getstatusoutput(cmd) - if care_result and 0 != status: - LOG.error( - 'CMD<%(cmd)s> \nSTDOUT:\n%(ret)s.', { - 'cmd': cmd, 'ret': ret}) - return None - else: - return ret - except Exception as e: - raise e diff --git a/testsuites/vstf/vstf_scripts/vstf/common/constants.py b/testsuites/vstf/vstf_scripts/vstf/common/constants.py deleted file mode 100644 index e054043e..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/common/constants.py +++ /dev/null @@ -1,76 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -slave_project_path = "/opt/esp-atf" -VSTFCPATH = "/opt/vstf" -sockaddr = VSTFCPATH + "/vstf.socket" -vstf_pid = VSTFCPATH + "/vstf-server.pid" -buff_size = 1024 - -# the message's len must be < 9999999999 -MSG_FLAG_LEN = 10 -MSG_FLAG = "%010d" - -# all command run timeout -TIMEOUT = 20 -# timmer SECOND -TICK = 3 - -HW_INFO = "HW_INFO" -CPU_INFO = "CPU INFO" -MEMORY_INFO = "MEMORY INFO" -OS_INFO = "OS INFO" - -TOOLS = ["pktgen", "netperf", "qperf", "netmap"] -OPERATIONS = ["start", "stop", "restart"] -ACTIONS = ["send", "receive"] -PROTOCOLS = ["tcp_lat", "udp_lat", "tcp_bw", "udp_bw"] -TPROTOCOLS = ["tcp", "udp"] -PROVIDERS = ["rdp", "fastlink", "l2switch", None] -TTYPES = ["throughput", "latency", "frameloss"] -SCENARIOS = ["Ti", "Tn", "Tnv", "Tu"] -SOCKET_BUF = 102400 -WAIT_BALANCE = 2 -CPU_USAGE_ROUND = 2 -PKTLOSS_ROUND = 2 -RATEP_ROUND = 3 -TIME_ROUND = 3 -TIME_FORMAT = "%Y-%m-%d %H:%M:%S" -TIME_FORMAT2 = "%Y/%m/%d %H:%M:%S" -TIME_FORMAT3 = "%Y%m%d_%H%M%S" -REPORT_DEFAULTS = "/tmp" - -CASE_ACTOR_MAP = { - # unidirection - "Tn-1": {"senders": [0], "receivers": [-1], "flows": 1}, - "Tn-2": {"senders": [0, -1], "receivers": [-1, 0], "flows": 2}, - # unidirection with vxlan - "Tn-3": {"senders": [0], "receivers": [-1], "flows": 1}, - "Tn-4": {"senders": [0, -1], "receivers": [-1, 0], "flows": 2}, - # unidirection - "Tnv-1": {"senders": [0], "receivers": [-1], "flows": 1}, - "Tnv-2": {"senders": [0, -1], "receivers": [-1, 0], "flows": 2}, - # unidirection with vxlan - "Tnv-3": {"senders": [0], "receivers": [-1], "flows": 1}, - "Tnv-4": {"senders": [0, -1], "receivers": [-1, 0], "flows": 2}, - - "Ti-1": {"senders": [0], "receivers": [-1], "flows": 1}, - "Ti-2": {"senders": [-1], "receivers": [0], "flows": 1}, - "Ti-3": {"senders": [0, -1], "receivers": [-1, 0], "flows": 2}, - "Ti-4": {"senders": [0], "receivers": [-1], "flows": 1}, - "Ti-5": {"senders": [-1], "receivers": [0], "flows": 1}, - "Ti-6": {"senders": [0, -1], "receivers": [-1, 0], "flows": 2}, - - "Tu-1": {"senders": [0], "receivers": [-1], "flows": 1}, - "Tu-2": {"senders": [-1], "receivers": [0], "flows": 1}, - "Tu-3": {"senders": [0, -1], "receivers": [-1, 0], "flows": 2}, - "Tu-4": {"senders": [0], "receivers": [-1], "flows": 1}, - "Tu-5": {"senders": [-1], "receivers": [0], "flows": 1}, - "Tu-6": {"senders": [0, -1], "receivers": [-1, 0], "flows": 2} -} diff --git a/testsuites/vstf/vstf_scripts/vstf/common/daemon.py b/testsuites/vstf/vstf_scripts/vstf/common/daemon.py deleted file mode 100644 index 46087493..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/common/daemon.py +++ /dev/null @@ -1,162 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -import sys -import os -import time -import atexit -import logging -from signal import SIGTERM - -LOG = logging.getLogger(__name__) - - -class Daemon(object): - """ - A generic daemon class. - - Usage: subclass the Daemon class and override the run() method - """ - - def __init__( - self, - pidfile, - stdin='/dev/null', - stdout='/dev/null', - stderr='/dev/null'): - super(Daemon, self).__init__() - self.stdin = stdin - self.stdout = stdout - self.stderr = stderr - self.pidfile = pidfile - - def daemonize(self): - """ - do the UNIX double-fork magic, see Stevens' "Advanced - Programming in the UNIX Environment" for details (ISBN 0201563177) - http://www.erlenstar.demon.co.uk/unix/faq_2.html#SEC16 - """ - try: - pid = os.fork() - if pid > 0: - sys.exit(0) - except OSError as e: - LOG.error("fork #1 failed: %(errno)s, %(strerror)s", - {'errno': e.errno, 'strerror': e.strerror}) - sys.exit(1) - - # decouple from parent environment - os.chdir("/") - os.setsid() - os.umask(0) - - # do second fork - try: - pid = os.fork() - if pid > 0: - # exit from second parent - sys.exit(0) - except OSError as e: - LOG.error("fork #1 failed: %(errno)s, %(strerror)s", - {'errno': e.errno, 'strerror': e.strerror}) - sys.exit(1) - - # redirect standard file descriptors - sys.stdout.flush() - sys.stderr.flush() - si = file(self.stdin, 'r') - so = file(self.stdout, 'a+') - se = file(self.stderr, 'a+', 0) - os.dup2(si.fileno(), sys.stdin.fileno()) - os.dup2(so.fileno(), sys.stdout.fileno()) - os.dup2(se.fileno(), sys.stderr.fileno()) - - # write pidfile - atexit.register(self.delpid) - pid = str(os.getpid()) - file(self.pidfile, 'w+').write("%s\n" % pid) - - def delpid(self): - os.remove(self.pidfile) - - def start(self): - """ - Start the daemon - """ - - # Check for a pidfile to see if the daemon already runs - try: - pf = file(self.pidfile, 'r') - pid = int(pf.read().strip()) - pf.close() - except IOError: - pid = None - - if pid: - message = "pidfile %s already exist. Daemon already running?\n" - sys.stderr.write(message % self.pidfile) - sys.exit(1) - LOG.info("daemon start to run daemonize") - # Start the daemon - self.daemonize() - self.run() - - def stop(self): - """ - Stop the daemon - """ - # Get the pid from the pidfile - try: - pf = file(self.pidfile, 'r') - pid = int(pf.read().strip()) - pf.close() - except IOError: - pid = None - - if not pid: - message = "pidfile %s does not exist. Daemon not running?\n" - sys.stderr.write(message % self.pidfile) - return # not an error in a restart - - # Try killing the daemon process - try: - while True: - os.kill(pid, SIGTERM) - time.sleep(0.1) - except OSError as err: - err = str(err) - if err.find("No such process") > 0: - if os.path.exists(self.pidfile): - os.remove(self.pidfile) - else: - print str(err) - sys.exit(1) - - def restart(self): - """ - Restart the daemon - """ - self.stop() - self.start() - - def run(self): - """ - You should override this method when you subclass Daemon. - It will be called after the process has been - daemonized by start() or restart(). - - """ - pass - - def daemon_die(self): - """You should override this method when you shutdown daemon - this func will be call by stop() before kill the process - - """ - pass diff --git a/testsuites/vstf/vstf_scripts/vstf/common/decorator.py b/testsuites/vstf/vstf_scripts/vstf/common/decorator.py deleted file mode 100644 index ed910556..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/common/decorator.py +++ /dev/null @@ -1,97 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -_DEFAULTS = "vstf check key defaults".encode() - - -def check(key, choices=[], defaults=_DEFAULTS): - def _deco(func): - def __deco(*args, **kwargs): - if key not in kwargs: - if defaults != _DEFAULTS: - kwargs[key] = defaults - else: - raise Exception( - "Error: '%s' is needed in %s" % - (key, func)) - - if choices and kwargs[key] not in choices: - raise Exception("Error: %s :%s" % (key, kwargs[key])) - ret = func(*args, **kwargs) - return ret - - return __deco - - return _deco - - -def dcheck(key, choices=[]): - def _deco(func): - def __deco(*args): - if len(args) == 2: - values = args[1] - elif len(args) == 1: - values = args[0] - else: - values = None - if isinstance(values, dict): - if key not in values: - raise Exception( - "Error: '%s' is needed in %s" % - (key, func)) - if choices and values[key] not in choices: - raise Exception("Error: %s :%s" % (key, values[key])) - ret = func(*args) - return ret - - return __deco - - return _deco - - -def vstf_input(key, types=str, choices=[], default=None): - def _deco(func): - def __deco(*args): - ret = func(*args) - if not isinstance(ret, dict): - ret = {} - in_str = "----> %s : " % key - if choices: - in_str = "---- %s\n" % (str(choices)) + in_str - while True: - if types == list or types == dict: - value = input(in_str) - else: - value = raw_input(in_str) - value = types(value) - if not value: - value = default - if not choices or value in choices: - break - ret.update({key: value}) - return ret - - return __deco - - return _deco - - -def namespace(): - def _deco(func): - def __deco(*args, **kwargs): - ret = func(*args, **kwargs) - nspace = kwargs.get("namespace", None) - if nspace: - ret = "ip netns exec %(namespace)s " % { - "namespace": nspace} + ret - return ret - - return __deco - - return _deco diff --git a/testsuites/vstf/vstf_scripts/vstf/common/excepts.py b/testsuites/vstf/vstf_scripts/vstf/common/excepts.py deleted file mode 100644 index 833eefa4..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/common/excepts.py +++ /dev/null @@ -1,22 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - - -class ChannelDie(Exception): - """rabbitmq's channel connect failed""" - pass - - -class UnsolvableExit(Exception): - """the soft maybe error , and the code can not solvable, must be exit""" - pass - - -class AgentExit(Exception): - pass diff --git a/testsuites/vstf/vstf_scripts/vstf/common/input.py b/testsuites/vstf/vstf_scripts/vstf/common/input.py deleted file mode 100644 index 14ec8552..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/common/input.py +++ /dev/null @@ -1,21 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -import os - - -def raw_choice(title): - ret = {'Y': True, 'N': False} - while True: - os.system("clear") - in_str = "\n%s:(y|n) " % title - uin = raw_input(in_str).title() - if uin in ['Y', 'N']: - break - return ret[uin] diff --git a/testsuites/vstf/vstf_scripts/vstf/common/log.py b/testsuites/vstf/vstf_scripts/vstf/common/log.py deleted file mode 100644 index b8b64888..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/common/log.py +++ /dev/null @@ -1,53 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -import logging - - -def _init_log_to_file(log_file, level, _format): - file_handler = logging.FileHandler(log_file) - file_handler.setLevel(level) - file_handler.setFormatter(logging.Formatter(_format)) - return file_handler - - -def _init_log_to_console(level, _format): - console = logging.StreamHandler() - console.setLevel(level) - console.setFormatter(logging.Formatter(_format)) - return console - - -def _init_log(log_file, level=logging.INFO, clevel=logging.INFO): - _format = '%(asctime)s <%(levelname)s> [%(funcName)s.%(lineno)d]: %(message)s' - # _format = '%(asctime)s [%(levelname)s] %(message)s' - _verbose = '%(levelname)s %(asctime)s [%(filename)s:%(lineno)d] %(funcName)s ### %(message)s' - _simple = '<%(levelname)s> [%(filename)s:%(lineno)d] ### %(message)s' - file_handler = _init_log_to_file(log_file, level, _verbose) - console = _init_log_to_console(clevel, _simple) - return file_handler, console - - -def setup_logging( - level=logging.INFO, - log_file="/var/log/esp_test.log", - clevel=logging.WARNING): - log = logging.getLogger() - log.setLevel(level) - file_handler, console = _init_log(log_file, level, clevel) - log.addHandler(file_handler) - log.addHandler(console) - - -if __name__ == "__main__": - setup_logging() - logger = logging.getLogger("common") - logger.info('this is a test.') - logger.warning('this is a test.') - logger.error('this is a test.') diff --git a/testsuites/vstf/vstf_scripts/vstf/common/message.py b/testsuites/vstf/vstf_scripts/vstf/common/message.py deleted file mode 100644 index d496990d..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/common/message.py +++ /dev/null @@ -1,150 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -import json -import uuid -import logging -import traceback -from vstf.common import constants - -LOG = logging.getLogger(__name__) - - -def json_defaults(obj): - if isinstance(obj, set): - return list(obj) - return "unknow obj" - - -def encode(msg): - """obj to string""" - if isinstance(msg, str): - return msg - else: - return json.dumps(msg, default=json_defaults) - - -def decode(msg): - """string to obj""" - if isinstance(msg, str): - return json.loads(msg) - else: - return msg - - -def gen_corrid(): - return str(uuid.uuid4()) - - -def add_context(msg, **kwargs): - return {'head': kwargs, 'body': msg} - - -def get_context(msg): - if "head" in msg.iterkeys(): - return msg['head'] - else: - return "" - - -def get_body(msg): - if "body" in msg.iterkeys(): - return msg['body'] - else: - return None - - -def get_corrid(context): - """ - :param return: string of corrid or empty - """ - if "corrid" in context.iterkeys(): - return context['corrid'] - else: - return "" - - -def send(func, data): - # the message must be a string - if not isinstance(data, str): - raise ValueError("the data must be a string") - - # the message's len must > 0 - msg_len = len(data) - if msg_len <= 0: - return True - - # the message's len must be less 999999999 - if len(str(msg_len)) > constants.MSG_FLAG_LEN: - raise ValueError("the data's len too long") - - data = (constants.MSG_FLAG % (msg_len)) + data - total_send = msg_len + constants.MSG_FLAG_LEN - - count = 0 - while count < total_send: - sent = func(data[count:]) - if 0 == sent: - raise RuntimeError("socket connection broken") - count += sent - - return msg_len - - -def sendto(func, data, addr): - # the message must be a string - if not isinstance(data, str): - raise ValueError("the data must be a string") - - # the message's len must > 0 - msg_len = len(data) - if msg_len <= 0: - return True - - # the message's len must be less 999999999 - if len(str(msg_len)) > constants.MSG_FLAG_LEN: - raise ValueError("the data's len too long") - - data = (constants.MSG_FLAG % (msg_len)) + data - total_send = msg_len + constants.MSG_FLAG_LEN - - count = 0 - while count < total_send: - sent = func(data[count:], addr) - if 0 == sent: - raise RuntimeError("socket connection broken") - count += sent - - return msg_len - - -def recv(func): - head = func(constants.MSG_FLAG_LEN) - # the FIN change to '' in python - if head == '': - raise RuntimeError("socket connection broken") - - if not head.isdigit(): - raise ValueError("the msg head is not a num.") - - msg_len = int(head) - chunks = [] - count = 0 - while count < msg_len: - chunk = func(min(msg_len - count, constants.buff_size)) - if chunk == '': - raise RuntimeError("socket connection broken") - chunks.append(chunk) - count += len(chunk) - - return ''.join(chunks) - - -def dumpstrace(): - return traceback.format_exc() diff --git a/testsuites/vstf/vstf_scripts/vstf/common/perfmark.py b/testsuites/vstf/vstf_scripts/vstf/common/perfmark.py deleted file mode 100644 index 4f5c3978..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/common/perfmark.py +++ /dev/null @@ -1,23 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -pktSize = 'AvgFrameSize' -offLoad = 'OfferedLoad' -percentLoss = 'PercentLoss' -bandwidth = 'Bandwidth' -minLatency = 'MinimumLatency' -maxLatency = 'MaximumLatency' -avgLatency = 'AverageLatency' -txCount = 'TxFrameCount' -rxCount = 'RxFrameCount' -duration = 'Duration' -cpu = 'CPU' -mppsGhz = 'MppspGhz' -rxMbps = "RxMbps" -txMbps = 'TxMbps' diff --git a/testsuites/vstf/vstf_scripts/vstf/common/pyhtml.py b/testsuites/vstf/vstf_scripts/vstf/common/pyhtml.py deleted file mode 100644 index b2162290..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/common/pyhtml.py +++ /dev/null @@ -1,326 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - - -from sys import stdout, modules - -doc_type = '\n' -default_title = "Html Page" -charset = '\n' - -html4_tags = { - 'a', - 'abbr', - 'acronym', - 'address', - 'area', - 'b', - 'base', - 'bdo', - 'big', - 'blockquote', - 'body', - 'br', - 'button', - 'caption', - 'cite', - 'code', - 'col', - 'colgroup', - 'dd', - 'del', - 'div', - 'dfn', - 'dl', - 'dt', - 'em', - 'fieldset', - 'form', - 'frame', - 'frameset', - 'h1', - 'h2', - 'h3', - 'h4', - 'h5', - 'h6', - 'head', - 'hr', - 'html', - 'i', - 'iframe', - 'img', - 'input', - 'ins', - 'kbd', - 'label', - 'legend', - 'li', - 'link', - 'map', - 'menu', - 'menuitem', - 'meta', - 'noframes', - 'noscript', - 'object', - 'ol', - 'optgroup', - 'option', - 'p', - 'param', - 'pre', - 'q', - 'samp', - 'script', - 'select', - 'small', - 'span', - 'strong', - 'style', - 'sub', - 'sup', - 'table', - 'tbody', - 'td', - 'textarea', - 'tfoot', - 'th', - 'thead', - 'title', - 'tr', - 'tt', - 'ul', - 'var'} -disused_tags = {'isindex', 'font', 'dir', 's', 'strike', - 'u', 'center', 'basefont', 'applet', 'xmp'} -html5_tags = { - 'article', - 'aside', - 'audio', - 'bdi', - 'canvas', - 'command', - 'datalist', - 'details', - 'dialog', - 'embed', - 'figcaption', - 'figure', - 'footer', - 'header', - 'keygen', - 'mark', - 'meter', - 'nav', - 'output', - 'progress', - 'rp', - 'rt', - 'ruby', - 'section', - 'source', - 'summary', - 'details', - 'time', - 'track', - 'video', - 'wbr'} - -nl = '\n' -tags = html4_tags | disused_tags | html5_tags - -__all__ = [x.title() for x in tags] + ['PyHtml', 'space'] - -self_close = {'input', 'img', 'link', 'br'} - - -def space(n): - return ' ' * n - - -class Tag(list): - tag_name = '' - - def __init__(self, *args, **kwargs): - self.attributes = kwargs - if self.tag_name: - name = self.tag_name - self.is_seq = False - else: - name = 'sequence' - self.is_seq = True - self._id = kwargs.get('id', name) - for arg in args: - self.add_obj(arg) - - def __iadd__(self, obj): - if isinstance(obj, Tag) and obj.is_seq: - for o in obj: - self.add_obj(o) - else: - self.add_obj(obj) - return self - - def add_obj(self, obj): - if not isinstance(obj, Tag): - obj = str(obj) - _id = self.set_id(obj) - setattr(self, _id, obj) - self.append(obj) - - def set_id(self, obj): - if isinstance(obj, Tag): - _id = obj._id - obj_lst = filter(lambda t: isinstance( - t, Tag) and t._id.startswith(_id), self) - else: - _id = 'content' - obj_lst = filter(lambda t: not isinstance(t, Tag), self) - length = len(obj_lst) - if obj_lst: - _id = '%s_%03i' % (_id, length) - if isinstance(obj, Tag): - obj._id = _id - return _id - - def __add__(self, obj): - if self.tag_name: - return Tag(self, obj) - self.add_obj(obj) - return self - - def __lshift__(self, obj): - if isinstance(obj, Tag): - self += obj - return obj - print "unknown obj: %s " % obj - return self - - def render(self): - result = '' - if self.tag_name: - result += '<%s%s%s>' % (self.tag_name, - self._render_attr(), - self._self_close() * ' /') - if not self._self_close(): - isnl = True - for c in self: - if isinstance(c, Tag): - result += isnl * nl - isnl = False - result += c.render() - else: - result += c - if self.tag_name: - result += '' % self.tag_name - result += nl - return result - - def _render_attr(self): - result = '' - for key, value in self.attributes.iteritems(): - if key != 'txt' and key != 'open': - if key == 'cl': - key = 'class' - result += ' %s="%s"' % (key, value) - return result - - def _self_close(self): - return self.tag_name in self_close - -""" -def tag_factory(tag): - class F(Tag): - tag_name = tag - - F.__name__ = tag.title() - return F - - -THIS = modules[__name__] - -for t in tags: - setattr(THIS, t.title(), tag_factory(t)) -""" -THIS = modules[__name__] -for t in tags: - obj = type(t.title(), (Tag, ), {'tag_name': t}) - setattr(THIS, t.title(), obj) - - -def _render_style(style): - result = '' - for item in style: - result += item - result += '\n{\n' - values = style[item] - for key, value in values.iteritems(): - result += " %s: %s;\n" % (key, value) - result += '}\n' - if result: - result = '\n' + result - return result - - -class PyHtml(Tag): - tag_name = 'html' - - def __init__(self, title=default_title): - self._id = 'html' - self += Head() - self += Body() - self.attributes = dict(xmlns='http://www.w3.org/1999/xhtml', lang='en') - self.head += Title(title) - - def __iadd__(self, obj): - if isinstance(obj, Head) or isinstance(obj, Body): - self.add_obj(obj) - elif isinstance(obj, Meta) or isinstance(obj, Link): - self.head += obj - else: - self.body += obj - _id = self.set_id(obj) - setattr(self, _id, obj) - return self - - def add_js(self, *arg): - for f in arg: - self.head += Script(type='text/javascript', src=f) - - def add_css(self, *arg): - for f in arg: - self.head += Link(rel='stylesheet', type='text/css', href=f) - - def output(self, name=''): - if name: - fil = open(name, 'w') - else: - fil = stdout - fil.write(self.as_string()) - fil.flush() - if name: - fil.close() - - def as_string(self): - return doc_type + self.render() - - def add_style(self, style): - self.head += Style(_render_style(style)) - - def add_table(self, data): - table = self << Table() - rows = len(data) - cols = len(zip(*data)) - - for i in range(rows): - tr = table << Tr() - tr << Th(data[i][0]) - for j in range(1, cols): - tr << Td(data[i][j]) diff --git a/testsuites/vstf/vstf_scripts/vstf/common/rsync.py b/testsuites/vstf/vstf_scripts/vstf/common/rsync.py deleted file mode 100644 index 03331368..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/common/rsync.py +++ /dev/null @@ -1,568 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - - -# from __future__ import nested_scopes - -import os -import os.path -import shutil -import glob -import re -import sys -import getopt -import stat -import string - -try: - import win32file -except: - win32file = None - - -class Cookie: - - def __init__(self): - self.sink_root = "" - self.target_root = "" - self.quiet = 0 - self.recursive = 0 - self.relative = 0 - self.dry_run = 0 - self.time = 0 - self.update = 0 - self.cvs_ignore = 0 - self.ignore_time = 0 - self.delete = 0 - self.delete_excluded = 0 - self.delete_from_source = 0 - self.size_only = 0 - self.modify_window = 2 - self.existing = 0 - self.filters = [] - self.case_sensitivity = 0 - if os.name == "nt": - self.case_sensitivity = re.I - - -def visit(cookie, dirname, names): - """Copy files names from sink_root + (dirname - sink_root) to target_root + (dirname - sink_root)""" - if os.path.split(cookie.sink_root)[ - 1]: # Should be tested with (C:\Cvs -> C:\)! (C:\Archives\MyDatas\UltraEdit -> C:\Archives\MyDatas) (Cvs -> "")! (Archives\MyDatas\UltraEdit -> Archives\MyDatas) (\Cvs -> \)! (\Archives\MyDatas\UltraEdit -> Archives\MyDatas) - dirname = dirname[len(cookie.sink_root) + 1:] - else: - dirname = dirname[len(cookie.sink_root):] - target_dir = os.path.join(cookie.target_root, dirname) - if not os.path.isdir(target_dir): - makeDir(cookie, target_dir) - sink_dir = os.path.join(cookie.sink_root, dirname) - - filters = [] - if cookie.cvs_ignore: - ignore = os.path.join(sink_dir, ".cvsignore") - if os.path.isfile(ignore): - filters = convertPatterns(ignore, "-") - filters = filters + cookie.filters - - names_excluded = [] - if filters: - # filter sink files (names): - name_index = 0 - while name_index < len(names): - name = names[name_index] - path = os.path.join(dirname, name) - path = convertPath(path) - if os.path.isdir(os.path.join(sink_dir, name)): - path = path + "/" - for filter in filters: - if re.search(filter[1], path, cookie.case_sensitivity): - if filter[0] == '-': - sink = os.path.join(sink_dir, name) - if cookie.delete_from_source: - if os.path.isfile(sink): - removeFile(cookie, sink) - elif os.path.isdir(sink): - removeDir(cookie, sink) - else: - logError( - "Sink %s is neither a file nor a folder (skip removal)" % - sink) - names_excluded += [names[name_index]] - del (names[name_index]) - name_index = name_index - 1 - break - elif filter[0] == '+': - break - name_index = name_index + 1 - - if cookie.delete and os.path.isdir(target_dir): - # Delete files and folder in target not present in filtered sink. - for name in os.listdir(target_dir): - if not cookie.delete_excluded and name in names_excluded: - continue - if name not in names: - target = os.path.join(target_dir, name) - if os.path.isfile(target): - removeFile(cookie, target) - elif os.path.isdir(target): - removeDir(cookie, target) - else: - pass - - for name in names: - # Copy files and folder from sink to target. - sink = os.path.join(sink_dir, name) - # print sink - target = os.path.join(target_dir, name) - if os.path.exists(target): - # When target already exit: - if os.path.isfile(sink): - if os.path.isfile(target): - # file-file - if shouldUpdate(cookie, sink, target): - updateFile(cookie, sink, target) - elif os.path.isdir(target): - # file-folder - removeDir(cookie, target) - copyFile(cookie, sink, target) - else: - # file-??? - logError( - "Target %s is neither a file nor folder (skip update)" % - sink) - - elif os.path.isdir(sink): - if os.path.isfile(target): - # folder-file - removeFile(cookie, target) - makeDir(cookie, target) - else: - # ???-xxx - logError( - "Sink %s is neither a file nor a folder (skip update)" % - sink) - - elif not cookie.existing: - # When target dont exist: - if os.path.isfile(sink): - # file - copyFile(cookie, sink, target) - elif os.path.isdir(sink): - # folder - makeDir(cookie, target) - else: - logError( - "Sink %s is neither a file nor a folder (skip update)" % - sink) - - -def log(cookie, message): - if not cookie.quiet: - try: - print message - except UnicodeEncodeError: - print message.encode("utf8") - - -def logError(message): - try: - sys.stderr.write(message + "\n") - except UnicodeEncodeError: - sys.stderr.write(message.encode("utf8") + "\n") - - -def shouldUpdate(cookie, sink, target): - try: - sink_st = os.stat(sink) - sink_sz = sink_st.st_size - sink_mt = sink_st.st_mtime - except: - logError( - "Fail to retrieve information about sink %s (skip update)" % - sink) - return 0 - - try: - target_st = os.stat(target) - target_sz = target_st.st_size - target_mt = target_st.st_mtime - except: - logError( - "Fail to retrieve information about target %s (skip update)" % - target) - return 0 - - if cookie.update: - return target_mt < sink_mt - cookie.modify_window - - if cookie.ignore_time: - return 1 - - if target_sz != sink_sz: - return 1 - - if cookie.size_only: - return 0 - - return abs(target_mt - sink_mt) > cookie.modify_window - - -def copyFile(cookie, sink, target): - log(cookie, "copy: %s to: %s" % (sink, target)) - if not cookie.dry_run: - try: - shutil.copyfile(sink, target) - except: - logError("Fail to copy %s" % sink) - - if cookie.time: - try: - s = os.stat(sink) - os.utime(target, (s.st_atime, s.st_mtime)) - except: - logError("Fail to copy timestamp of %s" % sink) - - -def updateFile(cookie, sink, target): - log(cookie, "update: %s to: %s" % (sink, target)) - if not cookie.dry_run: - # Read only and hidden and system files can not be overridden. - try: - try: - if win32file: - filemode = win32file.GetFileAttributesW(target) - win32file.SetFileAttributesW( - target, - filemode & ~win32file.FILE_ATTRIBUTE_READONLY & ~win32file.FILE_ATTRIBUTE_HIDDEN & ~win32file.FILE_ATTRIBUTE_SYSTEM) - else: - os.chmod(target, stat.S_IWUSR) - except: - # logError("Fail to allow override of %s" % target) - pass - - shutil.copyfile(sink, target) - if cookie.time: - try: - s = os.stat(sink) - os.utime(target, (s.st_atime, s.st_mtime)) - except: - # The utime api of the 2.3 version of python is not unicode - # compliant. - logError("Fail to copy timestamp of %s" % sink) - except: - logError("Fail to override %s" % sink) - - if win32file: - win32file.SetFileAttributesW(target, filemode) - - -def prepareRemoveFile(path): - if win32file: - filemode = win32file.GetFileAttributesW(path) - win32file.SetFileAttributesW(path, filemode & ~win32file.FILE_ATTRIBUTE_READONLY & - ~win32file.FILE_ATTRIBUTE_HIDDEN & ~win32file.FILE_ATTRIBUTE_SYSTEM) - else: - os.chmod(path, stat.S_IWUSR) - - -def removeFile(cookie, target): - # Read only files could not be deleted. - log(cookie, "remove: %s" % target) - if not cookie.dry_run: - try: - try: - prepareRemoveFile(target) - except: - # logError("Fail to allow removal of %s" % target) - pass - - os.remove(target) - except: - logError("Fail to remove %s" % target) - - -def makeDir(cookie, target): - log(cookie, "make dir: %s" % target) - if not cookie.dry_run: - try: - os.makedirs(target) - except: - logError("Fail to make dir %s" % target) - - -def visitForPrepareRemoveDir(arg, dirname, names): - for name in names: - path = os.path.join(dirname, name) - prepareRemoveFile(path) - - -def prepareRemoveDir(path): - prepareRemoveFile(path) - os.path.walk(path, visitForPrepareRemoveDir, None) - - -def OnRemoveDirError(func, path, excinfo): - logError("Fail to remove %s" % path) - - -def removeDir(cookie, target): - # Read only directory could not be deleted. - log(cookie, "remove dir: %s" % target) - if not cookie.dry_run: - prepareRemoveDir(target) - try: - shutil.rmtree(target, False, OnRemoveDirError) - except: - logError("Fail to remove dir %s" % target) - - -def convertPath(path): - # Convert windows, mac path to unix version. - separator = os.path.normpath("/") - if separator != "/": - path = re.sub(re.escape(separator), "/", path) - - # Help file, folder pattern to express that it should match the all file - # or folder name. - path = "/" + path - return path - - -def convertPattern(pattern, sign): - """Convert a rsync pattern that match against a path to a filter that match against a converted path.""" - - # Check for include vs exclude patterns. - if pattern[:2] == "+ ": - pattern = pattern[2:] - sign = "+" - elif pattern[:2] == "- ": - pattern = pattern[2:] - sign = "-" - - # Express windows, mac patterns in unix patterns (rsync.py extension). - separator = os.path.normpath("/") - if separator != "/": - pattern = re.sub(re.escape(separator), "/", pattern) - - # If pattern contains '/' it should match from the start. - temp = pattern - if pattern[0] == "/": - pattern = pattern[1:] - if temp[-1] == "/": - temp = temp[:-1] - - # Convert pattern rules: ** * ? to regexp rules. - pattern = re.escape(pattern) - pattern = string.replace(pattern, "\\?", ".") - pattern = string.replace(pattern, "\\*\\*", ".*") - pattern = string.replace(pattern, "\\*", "[^/]*") - pattern = string.replace(pattern, "\\*", ".*") - - if "/" in temp: - # If pattern contains '/' it should match from the start. - pattern = "^\\/" + pattern - else: - # Else the pattern should match the all file or folder name. - pattern = "\\/" + pattern - - if pattern[-2:] != "\\/" and pattern[-2:] != ".*": - # File patterns should match also folders. - pattern = pattern + "\\/?" - - # Pattern should match till the end. - pattern = pattern + "$" - return (sign, pattern) - - -def convertPatterns(path, sign): - """Read the files for pattern and return a vector of filters""" - filters = [] - f = open(path, "r") - while True: - pattern = f.readline() - if not pattern: - break - if pattern[-1] == "\n": - pattern = pattern[:-1] - - if re.match("[\t ]*$", pattern): - continue - if pattern[0] == "#": - continue - filters = filters + [convertPattern(pattern, sign)] - f.close() - return filters - - -def printUsage(): - """Print the help string that should printed by rsync.py -h""" - print "usage: rsync.py [options] source target" - print """ - -q, --quiet decrease verbosity - -r, --recursive recurse into directories - -R, --relative use relative path names - -u, --update update only (don't overwrite newer files) - -t, --times preserve times - -n, --dry-run show what would have been transferred - --existing only update files that already exist - --delete delete files that don't exist on the sending side - --delete-excluded also delete excluded files on the receiving side - --delete-from-source delete excluded files on the receiving side - -I, --ignore-times don't exclude files that match length and time - --size-only only use file size when determining if a file should - be transferred - --modify-window=NUM timestamp window (seconds) for file match (default=2) - --existing only update existing target files or folders - -C, --cvs-exclude auto ignore files in the same way CVS does - --exclude=PATTERN exclude files matching PATTERN - --exclude-from=FILE exclude patterns listed in FILE - --include=PATTERN don't exclude files matching PATTERN - --include-from=FILE don't exclude patterns listed in FILE - --version print version number - -h, --help show this help screen - -See http://www.vdesmedt.com/~vds2212/rsync.html for informations and updates. -Send an email to vivian@vdesmedt.com for comments and bug reports.""" - - -def printVersion(): - print "rsync.py version 2.0.1" - - -def main(args): - cookie = Cookie() - - opts, args = getopt.getopt(args, "qrRntuCIh", - ["quiet", "recursive", "relative", "dry-run", "time", "update", "cvs-ignore", - "ignore-times", "help", "delete", "delete-excluded", "delete-from-source", "existing", - "size-only", "modify-window=", "exclude=", "exclude-from=", "include=", "include-from=", - "version"]) - for o, v in opts: - if o in ["-q", "--quiet"]: - cookie.quiet = 1 - if o in ["-r", "--recursive"]: - cookie.recursive = 1 - if o in ["-R", "--relative"]: - cookie.relative = 1 - elif o in ["-n", "--dry-run"]: - cookie.dry_run = 1 - # --time is there to guaranty backward compatibility with previous buggy version. - elif o in ["-t", "--times", "--time"]: - cookie.time = 1 - elif o in ["-u", "--update"]: - cookie.update = 1 - elif o in ["-C", "--cvs-ignore"]: - cookie.cvs_ignore = 1 - elif o in ["-I", "--ignore-time"]: - cookie.ignore_time = 1 - elif o == "--delete": - cookie.delete = 1 - elif o == "--delete-excluded": - cookie.delete = 1 - cookie.delete_excluded = 1 - elif o == "--delete-from-source": - cookie.delete_from_source = 1 - elif o == "--size-only": - cookie.size_only = 1 - elif o == "--modify-window": - cookie.modify_window = int(v) - elif o == "--existing": - cookie.existing = 1 - elif o == "--exclude": - cookie.filters = cookie.filters + [convertPattern(v, "-")] - elif o == "--exclude-from": - cookie.filters = cookie.filters + convertPatterns(v, "-") - elif o == "--include": - cookie.filters = cookie.filters + [convertPattern(v, "+")] - elif o == "--include-from": - cookie.filters = cookie.filters + convertPatterns(v, "+") - elif o == "--version": - printVersion() - return 0 - elif o in ["-h", "--help"]: - printUsage() - return 0 - - if len(args) <= 1: - printUsage() - return 1 - - # print cookie.filters - - target_root = args[1] - try: # In order to allow compatibility below 2.3. - pass - if "supports_unicode_filenames" in os.path.__dict__ and os.path.supports_unicode_filenames: - target_root = unicode(target_root, sys.getfilesystemencoding()) - finally: - cookie.target_root = target_root - - sinks = glob.glob(args[0]) - if not sinks: - return 0 - - sink_families = {} - for sink in sinks: - try: # In order to allow compatibility below 2.3. - if "supports_unicode_filenames" in os.path.__dict__ and os.path.supports_unicode_filenames: - sink = unicode(sink, sys.getfilesystemencoding()) - except: - pass - sink_name = "" - sink_root = sink - sink_drive, sink_root = os.path.splitdrive(sink) - while not sink_name: - if sink_root == os.path.sep: - sink_name = "." - break - sink_root, sink_name = os.path.split(sink_root) - sink_root = sink_drive + sink_root - if sink_root not in sink_families: - sink_families[sink_root] = [] - sink_families[sink_root] = sink_families[sink_root] + [sink_name] - - for sink_root in sink_families.keys(): - if cookie.relative: - cookie.sink_root = "" - else: - cookie.sink_root = sink_root - - # In order to allow compatibility below 2.1 (nested scope where used - # before). - global y - y = sink_root - files = filter( - lambda x: os.path.isfile( - os.path.join( - y, - x)), - sink_families[sink_root]) - if files: - visit(cookie, sink_root, files) - - # global y # In order to allow compatibility below 2.1 (nested scope - # where used before). - y = sink_root - folders = filter( - lambda x: os.path.isdir( - os.path.join( - y, - x)), - sink_families[sink_root]) - for folder in folders: - folder_path = os.path.join(sink_root, folder) - if not cookie.recursive: - visit(cookie, folder_path, os.listdir(folder_path)) - else: - os.path.walk(folder_path, visit, cookie) - return 0 - - -if __name__ == "__main__": - sys.exit(main(sys.argv[1:])) diff --git a/testsuites/vstf/vstf_scripts/vstf/common/saltstack.py b/testsuites/vstf/vstf_scripts/vstf/common/saltstack.py deleted file mode 100644 index 96bdc911..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/common/saltstack.py +++ /dev/null @@ -1,211 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -import os -import sys -import inspect -import logging -import salt.client as sclient - -from vstf.common import cmds - -log = logging.getLogger(__name__) - - -class Mysalt(object): - IS_DIR = 1 - IS_FILE = 2 - FAILED = -1 - - def __init__(self): - self.cur_path = os.path.abspath(os.path.dirname(inspect.stack()[1][1])) - self.salt_conf = "/etc/salt/master" - if not os.path.exists(self.salt_conf): - raise Exception("this python must be run on the salt master.") - self.pillar_path = str( - cmds.execute("grep '^pillar_roots' \ - /etc/salt/master -A 2 | sed 1,2d | awk '{print $2}'") + '/') - if self.pillar_path == "": - log.warning( - "pillar path not found, make sure the pillar_roots configed") - else: - os.system("mkdir -p " + self.pillar_path) - - self.state_path = str(cmds.execute("grep '^file_roots' \ - /etc/salt/master -A 2 | sed 1,2d | awk '{print $2}'") + '/') - if self.state_path == "": - log.warning( - "state path not found, make sure the file_roots configed") - else: - os.system("mkdir -p " + self.state_path) - - self.salt = sclient.LocalClient() - - def slave_exists(self, host): - pslave = "/etc/salt/pki/master/minions/" + host - if os.path.exists(pslave): - return True - else: - return False - - def __is_dir_or_file(self, src): - if not os.path.exists(src): - return self.FAILED - if os.path.isdir(src): - return self.IS_DIR - elif os.path.isfile(src): - return self.IS_FILE - else: - return self.FAILED - - def __copy_target(self, target, flag=""): - if not os.path.exists(target): - log.error("target %(d)s not exists.", {'d': target}) - return False - - if flag == "pillar": - dst = self.pillar_path - elif flag == "state": - dst = self.state_path - else: - log.error( - "this file or dir not pillar or state, can not support now.") - return False - - if self.IS_FILE == self.__is_dir_or_file(target): - os.system('cp ' + target + ' ' + dst) - else: - os.system("cp -r " + target + ' ' + dst) - return True - - def copy(self, host, src, dst): - """copy file or dir to slave. - :src a file or a dir - :dst if src is a file, the dst must be like this /home/xx.py, not /home - """ - - '''check if the host exists on the master''' - if not self.slave_exists(host): - log.error("the host %(h)s is not held by master, please check.") - return False - - '''copy file to salt's file_roots''' - if not self.__copy_target(src, "state"): - return False - - if self.IS_DIR == self.__is_dir_or_file(src): - dir_name = os.path.basename(src) - self.salt.cmd(host, "cp.get_dir", ["salt://" + dir_name, dst]) - elif self.IS_FILE == self.__is_dir_or_file(src): - file_name = os.path.basename(src) - print self.salt.cmd(host, "cp.get_file", ["salt://" + file_name, dst]) - else: - log.error("not file and not dir, what is it") - return False - return True - - def __luxuriant_line(self, str, color): - if "red" == color: - return "\033[22;35;40m" + str + "\033[0m" - elif "green" == color: - return "\033[22;32;40m" + str + "\033[0m" - else: - return str - - def result_check(self, ret, host): - num_s = 0 - num_f = 0 - msg = "" - try: - for key in ret[host].keys(): - if True == ret[host][key]['result']: - num_s += 1 - else: - num_f += 1 - msg = msg + \ - self.__luxuriant_line("Failed %d:\n" % num_f, "red") - msg = msg + "\t" + key + '\n' - msg = msg + \ - self.__luxuriant_line("\t%s\n" % ret[host][key]['comment'], "red") - if True == ('retcode' in ret[host][key]['changes']): - msg = msg + \ - "RETCODE: %s\n" % (ret[host][key]['changes']['retcode']) - if True == ('stderr' in ret[host][key]['changes']): - msg = msg + \ - "STDERR: %s\n" % (ret[host][key]['changes']['stderr']) - if True == ('stdout' in ret[host][key]['changes']): - msg = msg + \ - "STDOUT: %s\n" % (ret[host][key]['changes']['stdout']) - msg = msg + \ - self.__luxuriant_line("total success: %d\n" % num_s, "green") - msg = msg + self.__luxuriant_line("failed: %d\n" % num_f, "red") - except Exception as e: - log.error( - "sorry, thy to check result happend error, <%(e)s>.\nret:%(ret)s", { - 'e': e, 'ret': ret}) - return -1 - log.info(':\n' + msg) - return num_f - - def run_state(self, host, fstate, ext_pillar={}, care_result=True): - try: - log.info("salt " + host + " state.sls " + - fstate + ' pillar=\'' + str(ext_pillar) + '\'') - ret = self.salt.cmd( - host, 'state.sls', [ - fstate, 'pillar=' + str(ext_pillar)], 180, 'list') - except Exception as e: - log.error("try to init host %(host)s happend error: <%(e)s>.", - {'host': host, 'e': e}) - if True == care_result: - raise e - - if 0 != self.result_check(ret, host) and care_result: - sys.exit(-1) - return True - - def salt_cmd(self, host, cmd): - # import pdb - # pdb.set_trace() - logging.info("Begin to run cmd %s on %s" % (host, cmd)) - - try: - ret = self.salt.cmd(host, 'cmd.run', [cmd]) - except Exception: - log.error("Remote salt execute failed.") - return ret - - def copy_by_state(self, host, src, state_cmd, **kwargs): - '''the src must be a dir, and the state.sls - must be the name of the dir name''' - - if not self.slave_exists(host): - log.error("the host %(h)s is not held by master, please check.") - return False - - if not self.__copy_target(src, "state"): - return False - - return self.run_state(host, state_cmd, kwargs, care_result=True) - - def get_master_ip(self, host=None): - if not host: - ret = cmds.execute( - "grep '^interface:' /etc/salt/master | awk '{print $2}'").strip() - return ret - try: - ret = self.salt.cmd(host, "grains.item", ["master"])[ - host]['master'] - except Exception: - log.error("salt happened error when get master ip") - return "" - return ret - - -mysalt = Mysalt() diff --git a/testsuites/vstf/vstf_scripts/vstf/common/ssh.py b/testsuites/vstf/vstf_scripts/vstf/common/ssh.py deleted file mode 100644 index 5cf196d4..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/common/ssh.py +++ /dev/null @@ -1,253 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -import os -import logging -from stat import S_ISDIR -import Queue -import shutil -import paramiko -from paramiko.ssh_exception import AuthenticationException - -LOG = logging.getLogger(__name__) - - -class SSHClientContext(paramiko.SSHClient): - - def __init__(self, ip, user, passwd, port=22): - self.host = ip - self.user = user - self.passwd = passwd - self.port = port - super(SSHClientContext, self).__init__() - - def sync_exec_command(self, cmd): - _, stdout, stderr = self.exec_command(cmd) - ret = stdout.channel.recv_exit_status() - out = stdout.read().strip() - err = stderr.read().strip() - LOG.info( - "in %s,%s,return:%s,output:%s:error:%s" % - (self.host, cmd, ret, out, err)) - return ret, out, err - - def connect(self): - super( - SSHClientContext, - self).connect( - self.host, - self.port, - self.user, - self.passwd, - timeout=10) - - def __enter__(self): - self.set_missing_host_key_policy(paramiko.AutoAddPolicy()) - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - self.close() - if exc_type == AuthenticationException: - return False - - -class SFTPClientContext(object): - - def __init__(self, ip, user, passwd, port=22): - self.host = ip - self.passwd = passwd - self.user = user - self.port = port - - def connect(self): - self.t = paramiko.Transport((self.host, self.port)) - self.t.connect(username=self.user, password=self.passwd) - self.sftp = paramiko.SFTPClient.from_transport(self.t) - - def get(self, remote, local): - self.sftp.get(remote, local) - - def put(self, local, remote): - self.sftp.put(local, remote) - - def mkdir(self, path): - self.sftp.mkdir(path) - - def rmdir(self, path): - self.sftp.rmdir(path) - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - if exc_type == TypeError: - return False - return False - - -def upload_conf_file(host, user, passwd, src, dst): - with SFTPClientContext(host, user, passwd) as ftp: - ftp.connect() - LOG.info('putting file:%s to %s:%s' % (src, host, dst)) - ftp.put(src, dst) - - -def upload_dir(host, user, passwd, local_dir, remote_dir): - assert remote_dir.startswith('/') - assert local_dir != '/' - while local_dir.endswith('/'): - local_dir = local_dir[:-1] - while remote_dir.endswith('/'): - remote_dir = remote_dir[:-1] - remote_dir = os.path.join(remote_dir, os.path.basename(local_dir)) - ret, _, _ = run_cmd(host, user, passwd, "sudo rm -rf %s" % remote_dir) - if ret != 0 and ret != 1: - LOG.error( - "somehow failed in rm -rf %s on host:%s,return:%s" % - (remote_dir, host, ret)) - exit(1) - with SFTPClientContext(host, user, passwd) as sftp: - sftp.connect() - for root, dirs, files in os.walk(local_dir): - for filename in files: - local_file = os.path.join(root, filename) - remote_file = local_file.replace(local_dir, remote_dir) - try: - sftp.put(local_file, remote_file) - except IOError: - sftp.mkdir(os.path.split(remote_file)[0]) - sftp.put(local_file, remote_file) - LOG.info("upload %s to remote %s" % (local_file, remote_file)) - for name in dirs: - local_path = os.path.join(root, name) - remote_path = local_path.replace(local_dir, remote_dir) - try: - sftp.mkdir(remote_path) - LOG.info("mkdir path %s" % remote_path) - except Exception as e: - raise - return remote_dir - - -def isdir(path, sftp): - exists = True - is_dir = False - file_stat = None - try: - file_stat = sftp.stat(path).st_mode - is_dir = S_ISDIR(file_stat) - except IOError: - exists = False - return exists, is_dir, file_stat - - -def download_file(host, user, passwd, remote_path, local_path): - assert not remote_path.endswith('/') - remote_file_name = os.path.basename(remote_path) - if local_path.endswith('/'): - if not os.path.exists(local_path): - raise Exception('path:%s not exist.' % local_path) - dest = os.path.join(local_path, remote_file_name) - else: - if os.path.isdir(local_path): - dest = os.path.join(local_path, remote_file_name) - else: - dir_path = os.path.dirname(local_path) - if not os.path.exists(dir_path): - raise Exception('path:%s not exist' % dir_path) - dest = local_path - transport = paramiko.Transport((host, 22)) - transport.connect(username=user, password=passwd) - sftp = paramiko.SFTPClient.from_transport(transport) - exists, is_dir, st = isdir(remote_path, sftp) - if exists and not is_dir: - sftp.get(remote_path, dest) - os.chmod(dest, st) - else: - raise Exception('error:cannot find the file or file is dir') - return True - - -def download_dir(host, user, passwd, remote_path, local_path): - while remote_path.endswith('/'): - remote_path = remote_path[:-1] - if local_path.endswith('/'): - if not os.path.exists(local_path): - raise Exception('path:%s not exist.' % local_path) - dest_path = os.path.join(local_path, os.path.basename(remote_path)) - else: - if os.path.isdir(local_path): - dest_path = os.path.join(local_path, os.path.basename(remote_path)) - else: - dir_name = os.path.dirname(local_path) - if os.path.exists(dir_name): - dest_path = local_path - else: - raise Exception('path:%s is not exists' % dir_name) - LOG.info( - "download_dir from host:%s:%s to dest:%s" % - (host, remote_path, dest_path)) - transport = paramiko.Transport((host, 22)) - transport.connect(username=user, password=passwd) - sftp = paramiko.SFTPClient.from_transport(transport) - exists, is_dir, _ = isdir(remote_path, sftp) - if exists and is_dir: - q = Queue.Queue(0) - q.put(remote_path) - while not q.empty(): - path = q.get() - st = sftp.lstat(path).st_mode - relative_path = path[len(remote_path):] - if relative_path.startswith('/'): - relative_path = relative_path[1:] - local = os.path.join(dest_path, relative_path) - if os.path.exists(local): - shutil.rmtree(local) - os.mkdir(local) - os.chmod(local, st) - file_list = sftp.listdir(path) - for item in file_list: - fullpath = os.path.join(path, item) - _, is_dir, st = isdir(fullpath, sftp) - if is_dir: - q.put(fullpath) - else: - dest = os.path.join(local, item) - sftp.get(fullpath, dest) - os.chmod(dest, st) - else: - raise Exception( - 'path:%s:%s not exists or is not a dir' % - (host, remote_path)) - return dest_path - - -def run_cmd(host, user, passwd, cmd): - with SSHClientContext(host, user, passwd) as ssh: - ssh.connect() - ret, stdout, stderr = ssh.sync_exec_command(cmd) - return ret, stdout, stderr - - -class SshFileTransfer(object): - - def __init__(self, ip, user, passwd): - self.ip, self.user, self.passwd = ip, user, passwd - - def upload_dir(self, src, dst): - return upload_dir(self.ip, self.user, self.passwd, src, dst) - - def download_dir(self, src, dst): - download_dir(self.ip, self.user, self.passwd, src, dst) - - def upload_file(self, src, dst): - upload_conf_file(self.ip, self.user, self.passwd, src, dst) - - def download_file(self, src, dst): - download_file(self.ip, self.user, self.passwd, src, dst) diff --git a/testsuites/vstf/vstf_scripts/vstf/common/test_func.py b/testsuites/vstf/vstf_scripts/vstf/common/test_func.py deleted file mode 100644 index 3fa23cdc..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/common/test_func.py +++ /dev/null @@ -1,23 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -from vstf.common import cliutil as util - - -@util.arg("--test", - dest="test", - default="", - help="a params of test-xx") -@util.arg("--xx", - dest="xx", - default="", - help="a params of test-xx") -def do_test_xx(args): - """this is a help doc""" - print "run test01 " + args.test + args.xx diff --git a/testsuites/vstf/vstf_scripts/vstf/common/unix.py b/testsuites/vstf/vstf_scripts/vstf/common/unix.py deleted file mode 100644 index ac3c9b72..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/common/unix.py +++ /dev/null @@ -1,64 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -import os -import socket -from vstf.common import constants -from vstf.common import message - - -class UdpServer(object): - - def __init__(self): - super(UdpServer, self).__init__() - try: - os.unlink(constants.sockaddr) - except OSError: - if os.path.exists(constants.sockaddr): - raise Exception("socket not found %s" % constants.sockaddr) - self.conn = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) - - def listen(self, backlog=5): - self.conn.listen(backlog) - - def accept(self): - return self.conn.accept() - - def bind(self, addr=constants.sockaddr): - return self.conn.bind(addr) - -# def send(self, data, addr): -# return message.sendto(self.conn.sendto, data, addr) - -# def recv(self, size=constants.buff_size): -# return message.recv(self.conn.recvfrom) - - def close(self): - self.conn.close() - - -class UdpClient(object): - - def __init__(self): - super(UdpClient, self).__init__() - if not os.path.exists(constants.sockaddr): - raise Exception("socket not found %s" % constants.sockaddr) - self.conn = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) - - def connect(self, addr=constants.sockaddr): - return self.conn.connect(addr) - - def send(self, data): - message.send(self.conn.send, data) - - def recv(self): - return message.recv(self.conn.recv) - - def close(self): - self.conn.close() diff --git a/testsuites/vstf/vstf_scripts/vstf/common/utils.py b/testsuites/vstf/vstf_scripts/vstf/common/utils.py deleted file mode 100644 index e9ee2791..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/common/utils.py +++ /dev/null @@ -1,264 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -import re -import logging -import subprocess -import random -import os -import signal -import time -from StringIO import StringIO - -LOG = logging.getLogger(__name__) - - -def info(): - def _deco(func): - def __deco(*args, **kwargs): - if "shell" in kwargs and kwargs["shell"]: - LOG.info(args[0]) - else: - LOG.info(' '.join(args[0])) - return func(*args, **kwargs) - return __deco - return _deco - - -@info() -def call(cmd, shell=False): - ret = subprocess.call(cmd, shell=shell) - if ret != 0: - LOG.info("warning: %s not success.", cmd) - - -@info() -def check_call(cmd, shell=False): - subprocess.check_call(cmd, shell=shell) - - -@info() -def check_output(cmd, shell=False): - return subprocess.check_output(cmd, shell=shell) - - -@info() -def my_popen(cmd, shell=False, stdout=None, stderr=None): - return subprocess.Popen(cmd, shell=shell, stdout=stdout, stderr=stderr) - - -def ping(ip): - cmd = "ping -w2 -c1 %s" % ip - p = my_popen(cmd, shell=True) - return 0 == p.wait() - - -def get_device_name(bdf): - path = '/sys/bus/pci/devices/0000:%s/net/' % bdf - path1 = '/sys/bus/pci/devices/0000:%s/virtio*/net/' % bdf - if os.path.exists(path): - device = check_output("ls " + path, shell=True).strip() - return device - else: # virtio driver - try: - device = check_output("ls " + path1, shell=True).strip() - return device - except Exception: - return None - - -def my_sleep(delay): - LOG.info('sleep %s' % delay) - time.sleep(delay) - - -def my_mkdir(filepath): - try: - LOG.info("mkdir -p %s" % filepath) - os.makedirs(filepath) - except OSError as e: - if e.errno == 17: - LOG.info("! %s already exists" % filepath) - else: - raise - - -def get_eth_by_bdf(bdf): - bdf = bdf.replace(' ', '') - path = '/sys/bus/pci/devices/0000:%s/net/' % bdf - if os.path.exists(path): - device = check_output("ls " + path, shell=True).strip() - else: - raise Exception("cann't get device name of bdf:%s" % bdf) - return device - - -def check_and_kill(process): - cmd = "ps -ef | grep -v grep | awk '{print $8}' | grep -w %s | wc -l" % process - out = check_output(cmd, shell=True) - if int(out): - check_call(['killall', process]) - - -def list_mods(): - return check_output( - "lsmod | sed 1,1d | awk '{print $1}'", - shell=True).split() - - -def check_and_rmmod(mod): - if mod in list_mods(): - check_call(['rmmod', mod]) - - -def kill_by_name(process): - out = check_output(['ps', '-A']) - for line in out.splitlines(): - values = line.split() - pid, name = values[0], values[3] - if process == name: - pid = int(pid) - os.kill(pid, signal.SIGKILL) - LOG.info("os.kill(%s)" % pid) - - -def ns_cmd(ns, cmd): - netns_exec_str = "ip netns exec %s " - if ns in (None, 'null', 'None', 'none'): - pass - else: - cmd = (netns_exec_str % ns) + cmd - return cmd - - -def randomMAC(): - mac = [0x00, 0x16, 0x3e, - random.randint(0x00, 0x7f), - random.randint(0x00, 0xff), - random.randint(0x00, 0xff)] - return ':'.join(map(lambda x: "%02x" % x, mac)) - - -class IPCommandHelper(object): - - def __init__(self, ns=None): - self.devices = [] - self.macs = [] - self.device_mac_map = {} - self.mac_device_map = {} - self.bdf_device_map = {} - self.device_bdf_map = {} - self.mac_bdf_map = {} - self.bdf_mac_map = {} - cmd = "ip link" - if ns: - cmd = "ip netns exec %s " % ns + cmd - buf = check_output(cmd, shell=True) - sio = StringIO(buf) - for line in sio: - m = re.match(r'^\d+:(.*):.*', line) - if m and m.group(1).strip() != "lo": - device = m.group(1).strip() - self.devices.append(device) - mac = self._get_mac(ns, device) - self.macs.append(mac) - for device, mac in zip(self.devices, self.macs): - self.device_mac_map[device] = mac - self.mac_device_map[mac] = device - - cmd = "ethtool -i %s" - if ns: - cmd = "ip netns exec %s " % ns + cmd - for device in self.devices: - buf = check_output(cmd % device, shell=True) - bdfs = re.findall( - r'^bus-info: \d{4}:(\d{2}:\d{2}\.\d*)$', - buf, - re.MULTILINE) - if bdfs: - self.bdf_device_map[bdfs[0]] = device - self.device_bdf_map[device] = bdfs[0] - mac = self.device_mac_map[device] - self.mac_bdf_map[mac] = bdfs[0] - self.bdf_mac_map[bdfs[0]] = mac - - @staticmethod - def _get_mac(ns, device): - cmd = "ip addr show dev %s" % device - if ns: - cmd = "ip netns exec %s " % ns + cmd - buf = check_output(cmd, shell=True) - macs = re.compile( - r"[A-F0-9]{2}(?::[A-F0-9]{2}){5}", - re.IGNORECASE | re.MULTILINE) - for mac in macs.findall(buf): - if mac.lower() not in ('00:00:00:00:00:00', 'ff:ff:ff:ff:ff:ff'): - return mac - return None - - def get_device_verbose(self, identity): - if identity in self.device_mac_map: - device = identity - elif identity in self.bdf_device_map: - device = self.bdf_device_map[identity] - elif identity in self.mac_device_map: - device = self.mac_device_map[identity] - else: - raise Exception("cann't find the device by identity:%s" % identity) - detail = { - 'bdf': self.device_bdf_map[device] if device in self.device_bdf_map else None, - 'iface': device, - 'mac': self.device_mac_map[device] if device in self.device_mac_map else None, - } - return detail - - -class AttrDict(dict): - """A dictionary with attribute-style access. It maps attribute access to - the real dictionary. """ - - def __init__(self, init={}): - dict.__init__(self, init) - - def __getstate__(self): - return self.__dict__.items() - - def __setstate__(self, items): - for key, val in items: - self.__dict__[key] = val - - def __repr__(self): - return "%s(%s)" % (self.__class__.__name__, dict.__repr__(self)) - - def __setitem__(self, key, value): - return super(AttrDict, self).__setitem__(key, value) - - def __getitem__(self, name): - return super(AttrDict, self).__getitem__(name) - - def __delitem__(self, name): - return super(AttrDict, self).__delitem__(name) - - __getattr__ = __getitem__ - __setattr__ = __setitem__ - - def copy(self): - ch = AttrDict(self) - return ch - - -if __name__ == "__main__": - ipcmd = IPCommandHelper() - print ipcmd.device_mac_map - print ipcmd.mac_device_map - print ipcmd.bdf_device_map - print ipcmd.device_bdf_map - print ipcmd.mac_bdf_map - print ipcmd.bdf_mac_map - print ipcmd.get_device_verbose("tap0") diff --git a/testsuites/vstf/vstf_scripts/vstf/common/vstfcli.py b/testsuites/vstf/vstf_scripts/vstf/common/vstfcli.py deleted file mode 100644 index ae4fecfb..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/common/vstfcli.py +++ /dev/null @@ -1,74 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -import argparse -import sys - - -class VstfHelpFormatter(argparse.HelpFormatter): - - def start_section(self, heading): - # Title-case the headings - heading = '%s%s' % (heading[0].upper(), heading[1:]) - super(VstfHelpFormatter, self).start_section(heading) - - -class VstfParser(argparse.ArgumentParser): - - def __init__(self, - prog='vstf', - description="", - epilog='', - add_help=True, - formatter_class=VstfHelpFormatter): - - super(VstfParser, self).__init__( - prog=prog, - description=description, - epilog=epilog, - add_help=add_help, - formatter_class=formatter_class) - self.subcommands = {} - - def _find_actions(self, subparsers, actions_module): - for attr in (a for a in dir(actions_module) if a.startswith('do_')): - command = attr[3:].replace('_', '-') - callback = getattr(actions_module, attr) - desc = callback.__doc__ or '' - action_help = desc.strip() - arguments = getattr(callback, 'arguments', []) - subparser = subparsers.add_parser( - command, - help=action_help, - description=desc, - add_help=False, - formatter_class=VstfHelpFormatter) - subparser.add_argument('-h', '--help', - action='help', - help=argparse.SUPPRESS) - self.subcommands[command] = subparser - for (args, kwargs) in arguments: - subparser.add_argument(*args, **kwargs) - subparser.set_defaults(func=callback) - - def set_subcommand_parser(self, target, metavar=""): - subparsers = self.add_subparsers(metavar=metavar) - self._find_actions(subparsers, target) - return subparsers - - def set_parser_to_subcommand(self, subparser, target): - self._find_actions(subparser, target) - - -if __name__ == "__main__": - from vstf.common import test_func - parser = VstfParser(prog="vstf", description="test parser") - parser.set_subcommand_parser(test_func) - args = parser.parse_args(sys.argv[1:]) - args.func(args) diff --git a/testsuites/vstf/vstf_scripts/vstf/controller/__init__.py b/testsuites/vstf/vstf_scripts/vstf/controller/__init__.py deleted file mode 100644 index 83b8d15d..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/controller/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## diff --git a/testsuites/vstf/vstf_scripts/vstf/controller/api_server.py b/testsuites/vstf/vstf_scripts/vstf/controller/api_server.py deleted file mode 100644 index 02bf486c..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/controller/api_server.py +++ /dev/null @@ -1,460 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - - -import uuid -import time -import os -import sys -import logging -import signal -import json - -from vstf.common import unix, message, cliutil, excepts -from vstf.common.vstfcli import VstfParser -from vstf.common.log import setup_logging -from vstf.common import daemon -from vstf.controller.fabricant import Fabricant -from vstf.agent.env.basic.commandline import CommandLine -from vstf.controller.env_build.env_build import EnvBuildApi as Builder -from vstf.controller.env_build.env_collect import EnvCollectApi -from vstf.controller.database.dbinterface import DbManage -import vstf.controller.sw_perf.performance as pf -from vstf.controller.settings.tester_settings import TesterSettings -from vstf.controller.settings.device_settings import DeviceSettings -from vstf.controller.settings.flows_settings import FlowsSettings -from vstf.controller.settings.mail_settings import MailSettings -from vstf.controller.settings.tool_settings import ToolSettings -from vstf.controller.settings.perf_settings import PerfSettings -from vstf.controller.sw_perf.perf_provider import PerfProvider -from vstf.controller.sw_perf.flow_producer import FlowsProducer -from vstf.controller.settings.forwarding_settings import ForwardingSettings -import vstf.controller.reporters.reporter as rp -import vstf.rpc_frame_work.rpc_producer as rpc -import vstf.common.constants as cst -import vstf.common.check as chk - -LOG = logging.getLogger(__name__) -cmd = CommandLine() - - -class OpsChains(object): - - def __init__(self, monitor, port): - """The ops chains will setup the proxy to rabbitmq - and setup a thread to watch the queues of rabbitmq - - """ - LOG.info("VSTF Manager start to listen to %s", monitor) - if not os.path.exists(cst.VSTFCPATH): - os.mkdir(cst.VSTFCPATH) - - self.chanl = rpc.Server(host=monitor, port=port) - self.dbconn = DbManage() - self.collection = EnvCollectApi(self.chanl) - - def list_devs(self, **kwargs): - target = kwargs.get('host') - if not target: - respond = "the target is empty, not support now." - else: - respond = self.chanl.call( - self.chanl.make_msg("list_nic_devices"), target) - return respond - - def src_install(self, host, config_file): - if not os.path.exists(config_file): - raise Exception("Can not found the config file.") - cfg = json.load(open(config_file)) - msg = self.chanl.make_msg("src_install", cfg=cfg) - return self.chanl.call(msg, host, timeout=1000) - - def create_images(self, host, config_file): - if not os.path.exists(config_file): - raise Exception("Can not found the config file.") - cfg = json.load(open(config_file)) - msg = self.chanl.make_msg("create_images", cfg=cfg) - return self.chanl.call(msg, host, timeout=1000) - - def clean_images(self, host, config_file): - if not os.path.exists(config_file): - raise Exception("Can not found the config file.") - cfg = json.load(open(config_file)) - msg = self.chanl.make_msg("clean_images", cfg=cfg) - return self.chanl.call(msg, host, timeout=1000) - - def apply_model(self, host, model=None, config_file=None): - if config_file is None: - config_file = "/etc/vstf/env/%s.json" % model - if not os.path.exists(config_file): - raise Exception("Can not found the config file.") - env = Builder(self.chanl, config_file) - ret = env.build() - return ret - - def disapply_model(self, host, model=None, config_file=None): - if config_file is None: - config_file = "/etc/vstf/env/%s.json" % model - if not os.path.exists(config_file): - raise Exception("Can not found the config file.") - env = Builder(self.chanl, config_file) - ret = env.clean() - return ret - - def list_tasks(self): - ret = self.dbconn.query_tasks() - head = [["Task ID", "Task Name", "Task Date", "Task Remarks"]] - if ret: - ret = head + ret - return ret - - def affctl_list(self, host): - if not host: - return "Need input the host" - return Fabricant(host, self.chanl).affctl_list() - - def _create_task(self, scenario): - taskid = self.dbconn.create_task(str(uuid.uuid4()), time.strftime( - cst.TIME_FORMAT), desc=scenario + "Test") - LOG.info("new Task id:%s" % taskid) - if -1 == taskid: - raise Exception("DB create task failed.") - - device = DeviceSettings().settings - hosts = [device["host"], device["tester"]] - for host in hosts: - LOG.info(host) - - devs = host["devs"][0] - keys = ["bdf", "iface", "mac"] - key = devs.keys()[0] - if key in keys: - name = devs[key] - else: - raise Exception("error devs :%s", devs) - - query = Fabricant(host["agent"], self.chanl) - nic_info = query.get_device_detail(identity=name) - - LOG.info(nic_info) - - os_info, cpu_info, mem_info, hw_info = self.collection.collect_host_info(host[ - "agent"]) - LOG.info(os_info) - LOG.info(cpu_info) - LOG.info(mem_info) - LOG.info(hw_info) - - self.dbconn.add_host_2task(taskid, - host["agent"], - json.dumps(hw_info[cst.HW_INFO]), - json.dumps(cpu_info[cst.CPU_INFO]), - json.dumps(mem_info[cst.MEMORY_INFO]), - nic_info["desc"], - json.dumps(os_info[cst.OS_INFO])) - - self.dbconn.add_extent_2task(taskid, "ixgbe", "driver", "") - self.dbconn.add_extent_2task(taskid, "OVS", "switch", "") - return taskid - - def settings(self, head, tail): - - forward_settings = ForwardingSettings() - head_d = { - "ip": head, - "namespace": forward_settings.settings["head"]["namespace"] - } - tail_d = { - "ip": tail, - "namespace": forward_settings.settings["tail"]["namespace"] - } - LOG.info(head_d) - LOG.info(tail_d) - forward_settings.set_head(head_d) - forward_settings.set_tail(tail_d) - - def report(self, rpath='./', mail_off=False, taskid=-1): - report = rp.Report(self.dbconn, rpath) - if taskid == -1: - taskid = self.dbconn.get_last_taskid() - report.report(taskid, mail_off) - info_str = "do report over" - return info_str - - def run_perf_cmd( - self, - case, - rpath='./', - affctl=False, - build_on=False, - save_on=False, - report_on=False, - mail_on=False): - LOG.info(case) - LOG.info( - "build_on:%s report_on:%s mail_on:%s" % - (build_on, report_on, mail_on)) - casetag = case['case'] - tool = case['tool'] - protocol = case['protocol'] - switch = "ovs" - provider = None - ttype = case['type'] - sizes = case['sizes'] - - ret, ret_str = chk.check_case_params(protocol, ttype, tool) - if not ret: - return ret_str - - scenario = self.dbconn.query_scenario(casetag) - LOG.info(scenario) - if not scenario: - LOG.warn("not support the case:%s", casetag) - return - - config_file = os.path.join("/etc/vstf/env", scenario + ".json") - - LOG.info(config_file) - env = Builder(self.chanl, config_file) - if build_on: - env.build() - flows_settings = FlowsSettings() - tool_settings = ToolSettings() - tester_settings = TesterSettings() - flow_producer = FlowsProducer(self.chanl, flows_settings) - provider = PerfProvider( - flows_settings.settings, - tool_settings.settings, - tester_settings.settings) - - perf = pf.Performance(self.chanl, provider) - flow_producer.create(scenario, casetag) - result = perf.run(tool, protocol, ttype, sizes, affctl) - LOG.info(flows_settings.settings) - LOG.info(result) - if save_on: - taskid = self._create_task(scenario) - testid = self.dbconn.add_test_2task( - taskid, casetag, protocol, ttype, switch, provider, tool) - LOG.info(testid) - self.dbconn.add_data_2test(testid, result) - if report_on: - self.report(rpath, not mail_on, taskid) - return result - - def run_perf_file( - self, - rpath='./', - affctl=False, - report_on=True, - mail_on=True): - perf_settings = PerfSettings() - flows_settings = FlowsSettings() - tool_settings = ToolSettings() - tester_settings = TesterSettings() - flow_producer = FlowsProducer(self.chanl, flows_settings) - provider = PerfProvider( - flows_settings.settings, - tool_settings.settings, - tester_settings.settings) - perf = pf.Performance(self.chanl, provider) - tests = perf_settings.settings - - for scenario, cases in tests.items(): - LOG.info(scenario) - if not cases: - continue - - config_file = os.path.join("/etc/vstf/env", scenario + ".json") - - LOG.info(config_file) - env = Builder(self.chanl, config_file) - env.build() - - taskid = self._create_task(scenario) - - for case in cases: - LOG.info(case) - casetag = case['case'] - tool = case['tool'] - protocol = case['protocol'] - provider = None - switch = "ovs" - ttype = case['type'] - sizes = case['sizes'] - - ret, ret_str = chk.check_case_params(protocol, ttype, tool) - if not ret: - LOG.warn(ret_str) - continue - - flow_producer.create(scenario, casetag) - result = perf.run(tool, protocol, ttype, sizes, affctl) - LOG.info(result) - - testid = self.dbconn.add_test_2task( - taskid, casetag, protocol, ttype, switch, provider, tool) - LOG.info(testid) - - self.dbconn.add_data_2test(testid, result) - - if report_on: - self.report(rpath, not mail_on, taskid) - - info_str = "do batch perf test successfully" - return info_str - - def collect_host_info(self, target): - if self.collection is not None: - return self.collection.collect_host_info(target) - else: - return "collection is None" - - -class Manager(daemon.Daemon): - - def __init__(self): - """ - The manager will create a socket for vstfadm. - also the manager own a ops chains - """ - super(Manager, self).__init__(cst.vstf_pid) - # the connection of socket - self.conn = None - # the operations of manager - self.ops = None - # record the daemon run flag - self.run_flag = True - - def deal_unknown_obj(self, obj): - return "unknown response %s:%s" % (self, obj) - - def run(self): - signal.signal(signal.SIGTERM, self.daemon_die) - # setup the socket server for communicating with vstfadm - try: - self.conn = unix.UdpServer() - self.conn.bind() - self.conn.listen() - except Exception as e: - raise e - - # accept the connection of vstfadm and recv the command - # run the command from vstfadm and return the response - while self.run_flag: - conn, addr = self.conn.accept() - LOG.debug("accept the conn: %(conn)s", {'conn': conn}) - - # recv the msg until the conn break. - - while True: - try: - data = message.recv(conn.recv) - LOG.debug("Manager recv the msg: %(msg)s", {'msg': data}) - msg = message.decode(data) - body = message.get_body(msg) - context = message.get_context(msg) - except RuntimeError: - LOG.debug("manage catch the connection close!") - break - except Exception as e: - LOG.error("Manager recv message from socket failed.") - self.daemon_die() - raise e - - try: - func = getattr(self.ops, body.get('method')) - LOG.info("Call function:%s, args:%s", - func.__name__, body.get('args')) - response = func(**body.get('args')) - LOG.info("response: %s", response) - except excepts.UnsolvableExit as e: - msg = "The manager opps, exit now" - LOG.error(msg) - # the manager has no need to be continue, just return - # this msg and exit normal - self.daemon_die() - raise e - except Exception as e: - # here just the function failed no need exit, just return - # the msg - msg = "Run function failed. [ %s ]" % (e) - response = msg - LOG.error(msg) - try: - response = message.add_context(response, **context) - LOG.debug( - "Manager send the response: <%(r)s", { - 'r': response}) - message.send(conn.send, message.encode(response)) - except Exception as e: - self.daemon_die() - raise e - # close the connection when conn down - conn.close() - - def daemon_die(self, signum, frame): - """overwrite daemon.Daemon.daemon_die(self)""" - LOG.info("manage catch the signal %s to exit." % signum) - if self.conn: - # we can not close the conn direct, just tell manager to stop - # accept - self.run_flag = False - - if self.ops: - # stop the ops's proxy - # maybe happen AttributeError: 'BlockingConnection' object has no attribute 'disconnect' - # this a know bug in pika. fix in 0.9.14 release - try: - self.ops.chanl.close() - except AttributeError: - LOG.warning("The connection close happens attribute error") - - def start_manage(self, monitor="localhost", port=5672): - try: - # create manager's ops chains here will create a proxy to rabbitmq - self.ops = OpsChains(monitor, port) - except Exception as e: - raise e - self.start() - - def stop_manage(self): - self.stop() - - -@cliutil.arg("--monitor", - dest="monitor", - default="localhost", - action="store", - help="which ip to be monitored") -@cliutil.arg("--port", - dest="port", - default="5672", - action="store", - help="rabbitmq conn server") -def do_start(args): - Manager().start_manage(args.monitor, args.port) - - -def do_stop(args): - Manager().stop_manage() - - -def main(): - """this is for vstfctl""" - setup_logging( - level=logging.INFO, - log_file="/var/log/vstf/vstf-manager.log", - clevel=logging.INFO) - parser = VstfParser( - prog="vstf-manager", - description="vstf manager command line") - parser.set_subcommand_parser(target=sys.modules[__name__]) - args = parser.parse_args() - args.func(args) diff --git a/testsuites/vstf/vstf_scripts/vstf/controller/database/__init__.py b/testsuites/vstf/vstf_scripts/vstf/controller/database/__init__.py deleted file mode 100644 index 83b8d15d..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/controller/database/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## diff --git a/testsuites/vstf/vstf_scripts/vstf/controller/database/constants.py b/testsuites/vstf/vstf_scripts/vstf/controller/database/constants.py deleted file mode 100644 index e5070122..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/controller/database/constants.py +++ /dev/null @@ -1,63 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -SCENARIO_NAME_LEN = 16 -DESC_LEN = 256 -FIGURE_PATH_LEN = 128 - -CASE_TAG_LEN = 16 -CASE_NAME_LEN = 128 -DIRECTION_LEN = 128 -CONF_LEN = 256 - -HOST_NAME_LEN = 32 - -CPU_INFO_LEN = 1024 - -NORMAL_VAR_LEN = 32 -NORMAL_VAR_LEN1 = 64 - -SWITCH_LEN = 16 -PROTOCOL_LEN = 16 -PROVIDER_LEN = 16 - -TOOLS_LEN = 32 -TYPE_LEN = 16 - -EXT_INFO_LEN = 256 -DBPATH = "/opt/vstf/vstf.db" -# CaseTag, ScenarioName, CaseName, FigurePath, Description, Direction, Configure -CASE_INFO_LIST = [ - ['Ti-1', 'Ti', 'Ti_VM_RX_Tester-VM', 'res/', ' ', 'Tester->VM', 'tx', 'w/,wo VLAN'], - ['Ti-2', 'Ti', 'Ti_VM_TX_VM-Tester', 'res/', ' ', 'VM->Tester', 'rx', 'w/,wo VLAN'], - ['Ti-3', 'Ti', 'Ti_VM_RXTX_VM-Tester', 'res/', ' ', 'Tester<->VM', 'rxtx', 'w/,wo VLAN'], - ['Ti-4', 'Ti', 'Ti_VM_RX_Tester-VM_VXLAN', 'res/', ' ', 'Tester->VM', 'tx', 'VXLAN'], - ['Ti-5', 'Ti', 'Ti_VM_TX_VM-Tester_VXLAN', 'res/', ' ', 'VM->Tester', 'rx', 'VXLAN'], - ['Ti-6', 'Ti', 'Ti_VM_RXTX_VM-Tester_VXLAN', 'res/', ' ', 'Tester<->VM', 'rxtx', 'VXLAN'], - ['Tu-1', 'Tu', 'Tu_VM_RX_VM-VM', 'res/', ' ', 'Tester->VM', 'tx', 'w/,wo VLAN'], - ['Tu-2', 'Tu', 'Tu_VM_TX_VM-VM', 'res/', ' ', 'VM->Tester', 'rx', 'w/,wo VLAN'], - ['Tu-3', 'Tu', 'Tu_VM_RXTX_VM-VM', 'res/', ' ', 'Tester<->VM', 'rxtx', 'w/,wo VLAN'], - ['Tu-4', 'Tu', 'Tu_VM_RX_VM-VM_VXLAN', 'res/', ' ', 'Tester->VM', 'tx', 'VXLAN'], - ['Tu-5', 'Tu', 'Tu_VM_TX_VM-VM_VXLAN', 'res/', ' ', 'VM->Tester', 'rx', 'VXLAN'], - ['Tu-6', 'Tu', 'Tu_VM_RXTX_VM-VM_VXLAN', 'res/', ' ', 'VM<->Tester', 'rxtx', 'VXLAN'], - ['Tn-1', 'Tn', 'Tn_VSW_FWD_Tester-Tester', 'res/', ' ', 'Tester->Tester', 'tx', 'w/,wo VLAN'], - ['Tn-2', 'Tn', 'Tn_VSW_FWD-BI_Tester-Tester', 'res/', ' ', 'Tester<->Tester', 'rxtx', 'w/,wo VLAN'], - ['Tn-3', 'Tn', 'Tn_VSW_FWD_Tester-Tester_VXLAN', 'res/', ' ', 'Tester->Tester', 'tx', 'VXLAN'], - ['Tn-4', 'Tn', 'Tn_VSW_FWD-BI_Tester-Tester_VXLAN', 'res/', ' ', 'Tester<->Tester', 'rxtx', 'VXLAN'], - ['Tnv-1', 'Tnv', 'TnV_VSW_FWD_Tester-Tester', 'res/', ' ', 'Tester->Tester', 'tx', 'w/,wo VLAN'], - ['Tnv-2', 'Tnv', 'TnV_VSW_FWD-BI_Tester-Tester', 'res/', ' ', 'Tester<->Tester', 'rxtx', 'w/,wo VLAN'], - ['Tnv-3', 'Tnv', 'TnV_VSW_FWD_Tester-Tester_VXLAN', 'res/', ' ', 'Tester->Tester', 'tx', 'VXLAN'], - ['Tnv-4', 'Tnv', 'TnV_VSW_FWD-BI_Tester-Tester_VXLAN', 'res/', ' ', 'Tester<->Tester', 'rxtx', 'VXLAN'] -] -SCENARIO_INFO_LIST = [ - ['Ti', 'res/', ' '], - ['Tu', 'res/', ' '], - ['Tn', 'res/', ' '], - ['Tnv', 'res/', ' '], -] diff --git a/testsuites/vstf/vstf_scripts/vstf/controller/database/dbinterface.py b/testsuites/vstf/vstf_scripts/vstf/controller/database/dbinterface.py deleted file mode 100644 index a2aad9e8..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/controller/database/dbinterface.py +++ /dev/null @@ -1,718 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -import os -import logging - -from sqlalchemy import create_engine -from sqlalchemy.orm import sessionmaker -from sqlalchemy import and_ -import vstf.controller.database.tables as table -from vstf.controller.database import constants as const - -LOG = logging.getLogger(__name__) - -""" -@event.listens_for(Engine, "before_cursor_execute") -def before_cursor_execute(conn, cursor, statement, - parameters, context, executemany): - conn.info.setdefault('query_start_time', []).append(time.time()) - logging.debug("Start Query: %s", statement) -@event.listens_for(Engine, "after_cursor_execute") -def after_cursor_execute(conn, cursor, statement, - parameters, context, executemany): - total = time.time() - conn.info['query_start_time'].pop(-1) - logging.debug("Query Complete!") - logging.debug("Total Time: %f", total)""" - - -class DbManage(object): - - def __init__(self, db_name=const.DBPATH): - db_exists = os.path.exists(db_name) - try: - self._engine = create_engine('sqlite:///%s' % db_name, echo=False) - db_session = sessionmaker(bind=self._engine) - self._session = db_session() - except Exception as e: - raise e - - # if the db is new , create all tables and init static tables - if not db_exists: - self.create_tables() - self.init_tables() - - def __delete__(self): - self._engine.close_all() - - def create_tables(self): - table.Base.metadata.create_all(self._engine) - self._session.commit() - - def drop_tables(self): - table.Base.metadata.drop_all(self._engine) - self._session.commit() - - def init_tables(self): - self.init_casetable() - self.init_scenario_table() - self._session.commit() - - def init_scenario_table(self): - items = [] - for values in const.SCENARIO_INFO_LIST: - item = table.TblScenarioInfo(ScenarioName=values[0], - FigurePath=values[1], - Description=values[2]) - items.append(item) - self._session.add_all(items) - - # Single TblCaseInfo API - def init_casetable(self): - items = [] - for values in const.CASE_INFO_LIST: - item = table.TblCaseInfo(CaseTag=values[0], - ScenarioName=values[1], - CaseName=values[2], - FigurePath=values[3], - Description=values[4], - Direction=values[5], - Directiontag=values[6], - Configure=values[7]) - items.append(item) - self._session.add_all(items) - - def query_caseinfo(self): - query = self._session.query(table.TblCaseInfo.ScenarioName, - table.TblCaseInfo.CaseTag, - table.TblCaseInfo.CaseName, - table.TblCaseInfo.Direction, - table.TblCaseInfo.Configure) - return query.all() - - def query_case(self, casetag): - query = self._session.query(table.TblCaseInfo.ScenarioName, - table.TblCaseInfo.Directiontag) - return query.first() - - # Single TblTaskList API - def get_last_taskid(self): - query = self._session.query(table.TblTaskList.TaskID) - if query: - return query.all()[-1][0] - else: - return 0 - - def query_tasklist(self): - query = self._session.query(table.TblTaskList) - return query.all() - - def query_taskdate(self, taskid): - query = self._session.query(table.TblTaskList.Date).filter(and_( - table.TblTaskList.TaskID == taskid)) - result = "" - if query: - result += query.first()[0] - return result - - def query_taskname(self, taskid): - query = self._session.query(table.TblTaskList.TaskName).filter(and_( - table.TblTaskList.TaskID == taskid)) - result = "" - if query: - result += query.first()[0] - return result - - def create_task(self, name, date, desc): - try: - item = table.TblTaskList(name, date, desc) - self._session.add(item) - self._session.commit() - except Exception: - return -1 - - return self.get_last_taskid() - - # Single TblHostInfo API - def add_host_2task(self, taskid, name, machine, cpu, men, nic, os): - """All var except task must be string""" - item = table.TblHostInfo(taskid, name, machine, cpu, men, nic, os) - - self._session.add(item) - self._session.commit() - - def query_task_host_list(self, taskid): - query = self._session.query(table.TblHostInfo.HostName, - table.TblHostInfo.Server, - table.TblHostInfo.CPU, - table.TblHostInfo.MEM, - table.TblHostInfo.NIC, - table.TblHostInfo.OS).filter( - table.TblHostInfo.TaskID == taskid) - return query.all() - - # Single TblTestList API - def get_last_testid(self): - query = self._session.query(table.TblTestList.TestID) - print query.all() - if query: - return query.all()[-1][0] - else: - return 0 - - def add_test_2task( - self, - task, - case, - protocol, - typ, - switch, - provider, - tool): - try: - item = table.TblTestList( - task, case, protocol, typ, switch, provider, tool) - self._session.add(item) - self._session.commit() - except Exception: - return -1 - - return self.get_last_testid() - - def get_test_type(self, testid): - query = self._session.query(table.TblTestList.Type).filter( - table.TblTestList.TestID == testid) - return query.first() - - def add_extent_2task(self, task, name, content, description): - item = table.TblEXTInfo(task, name, content, description) - self._session.add(item) - self._session.commit() - - def add_data_2test(self, testid, data): - """ - :data example {'64':{ - 'AvgFrameSize':0 - 'OfferedLoad':0 - 'PercentLoss':0 - 'Bandwidth':0 - 'MinimumLatency':0 - 'MaximumLatency':0 - 'AverageLatency':0 - 'TxFrameCount':0 - 'RxFrameCount':0 - 'Duration':0 - 'CPU':0 - 'MppspGhz':0 - }} - """ - ptype = self.get_test_type(testid) - instance_map = { - 'throughput': table.TblThroughput, - 'frameloss': table.TblFrameloss, - 'latency': table.TblLatency - } - - if ptype and ptype[0] not in instance_map: - print "cant find this test(id=%d)" % (testid) - return False - - test_table_instance = instance_map[ptype[0]] - for pktlen in data.iterkeys(): - args = data.get(pktlen) - query = self._session.query(test_table_instance).filter(and_( - test_table_instance.TestID == testid, - test_table_instance.AvgFrameSize == pktlen)) - if query.all(): - data_dict = {} - for key, value in data.items(): - if key in test_table_instance.__dict__: - data_dict[test_table_instance.__dict__[key]] = value - query.update(data_dict) - else: - print args - tester = test_table_instance(testid, pktlen, **args) - self._session.add(tester) - self._session.commit() - - def query_tasks(self): - result = [] - ret = self._session.query(table.TblTaskList) - if ret: - for tmp in ret.all(): - result.append( - [tmp.TaskID, tmp.TaskName, tmp.Date, tmp.EXTInfo]) - return result - - def query_all_task_id(self): - query = self._session.query(table.TblTaskList.TaskID) - if query: - return query.all() - else: - return [] - - def get_caseinfo(self): - query = self._session.query(table.TblCaseInfo.ScenarioName, - table.TblCaseInfo.CaseTag, - table.TblCaseInfo.CaseName, - table.TblCaseInfo.Direction, - table.TblCaseInfo.Configure) - return query.all() - - def query_scenario(self, casetag): - query = self._session.query( - table.TblCaseInfo.ScenarioName).filter( - table.TblCaseInfo.CaseTag == casetag) - ret = "" - if query and query.first(): - ret = query.first()[0] - return ret - - def query_casefigure(self, casetag, tools): - query = self._session.query(table.TblCaseInfo.FigurePath).filter(and_( - table.TblCaseInfo.CaseTag == casetag)) - result = "" - if query: - result += query.first()[0] - print tools, casetag - result += tools + '/' + casetag + '.jpg' - return result - - def query_casename(self, casetag): - query = self._session.query(table.TblCaseInfo.CaseName).filter(and_( - table.TblCaseInfo.CaseTag == casetag)) - result = "" - if query: - result += query.first()[0] - return result - - # Single TblTestList API - - def query_caselist(self, taskid, scenario): - query = self._session.query( - table.TblTestList.CaseTag).filter( - and_( - table.TblTestList.CaseTag == table.TblCaseInfo.CaseTag, - table.TblCaseInfo.ScenarioName == scenario, - table.TblTestList.TaskID == taskid)).group_by( - table.TblCaseInfo.CaseTag) - return query.all() - - def query_testlist(self, taskid, scenario): - """ - - :rtype : object - """ - query = self._session.query(table.TblTestList).filter(and_( - table.TblTestList.CaseTag == table.TblCaseInfo.CaseTag, - table.TblCaseInfo.ScenarioName == scenario, - table.TblTestList.TaskID == taskid)) - return query.all() - - def query_casetool(self, taskid, casetag, provider, ptype): - query = self._session.query(table.TblTestList.Tools).filter(and_( - table.TblTestList.TaskID == taskid, - table.TblTestList.CaseTag == casetag, - table.TblTestList.Provider == provider, - table.TblTestList.Type == ptype)) - return query.all() - - def query_casetools(self, taskid, casetag): - query = self._session.query( - table.TblTestList.Tools).filter( - and_( - table.TblTestList.CaseTag == casetag, - table.TblTestList.TaskID == taskid)).group_by( - table.TblTestList.Tools) - return query.all() - - def query_scenariolist(self, taskid): - query = self._session.query( - table.TblCaseInfo.ScenarioName).filter( - and_( - table.TblTestList.CaseTag == table.TblCaseInfo.CaseTag, - table.TblTestList.TaskID == taskid)).group_by( - table.TblCaseInfo.ScenarioName) - return query.all() - - def query_throughput_load(self, taskid, casetag, provider): - ptype = 'throughput' - query = self._session.query( - table.TblThroughput.AvgFrameSize, - table.TblThroughput.OfferedLoad).filter( - and_( - table.TblTestList.TaskID == taskid, - table.TblTestList.CaseTag == casetag, - table.TblTestList.Provider == provider, - table.TblTestList.Type == ptype, - table.TblTestList.TestID == table.TblThroughput.TestID)) - return query.all() - - def query_throughput_bandwidth(self, taskid, casetag, provider): - ptype = 'throughput' - query = self._session.query( - table.TblThroughput.AvgFrameSize, - table.TblThroughput.Bandwidth).filter( - and_( - table.TblTestList.TaskID == taskid, - table.TblTestList.CaseTag == casetag, - table.TblTestList.Provider == provider, - table.TblTestList.Type == ptype, - table.TblTestList.TestID == table.TblThroughput.TestID)) - return query.all() - - def query_throughput_table(self, taskid, casetag, provider): - ptype = 'throughput' - query = self._session.query( - table.TblThroughput.AvgFrameSize, - table.TblThroughput.Bandwidth, - table.TblThroughput.OfferedLoad, - table.TblThroughput.CPU, - table.TblThroughput.MppspGhz, - table.TblThroughput.MinimumLatency, - table.TblThroughput.MaximumLatency, - table.TblThroughput.AverageLatency, - ).filter( - and_( - table.TblTestList.TaskID == taskid, - table.TblTestList.CaseTag == casetag, - table.TblTestList.Provider == provider, - table.TblTestList.Type == ptype, - table.TblTestList.TestID == table.TblThroughput.TestID)) - return query.all() - - def query_throughput_simpletable(self, taskid, casetag, provider): - ptype = 'throughput' - query = self._session.query( - table.TblThroughput.AvgFrameSize, - table.TblThroughput.Bandwidth, - table.TblThroughput.OfferedLoad, - table.TblThroughput.CPU, - table.TblThroughput.MppspGhz, - table.TblThroughput.AverageLatency, - ).filter( - and_( - table.TblTestList.TaskID == taskid, - table.TblTestList.CaseTag == casetag, - table.TblTestList.Provider == provider, - table.TblTestList.Type == ptype, - table.TblTestList.TestID == table.TblThroughput.TestID)) - return query.all() - - def query_testdata(self, testid, ptype): - obj = getattr(table, "Tbl%s" % (ptype.title())) - query = self._session.query(obj).filter(obj.TestID == testid) - return query.all() - - def query_throughput_avg(self, taskid, casetag, provider): - ptype = 'throughput' - query = self._session.query( - table.TblThroughput.AvgFrameSize, - table.TblThroughput.AverageLatency).filter( - and_( - table.TblTestList.TaskID == taskid, - table.TblTestList.CaseTag == casetag, - table.TblTestList.Provider == provider, - table.TblTestList.Type == ptype, - table.TblTestList.TestID == table.TblThroughput.TestID)) - return query.all() - - def query_frameloss_bandwidth(self, taskid, casetag, provider): - ptype = 'frameloss' - query = self._session.query( - table.TblFrameloss.AvgFrameSize, - table.TblFrameloss.Bandwidth).filter( - and_( - table.TblTestList.TaskID == taskid, - table.TblTestList.CaseTag == casetag, - table.TblTestList.Provider == provider, - table.TblTestList.Type == ptype, - table.TblTestList.TestID == table.TblFrameloss.TestID)) - return query.all() - - def query_frameloss_load(self, taskid, casetag, provider): - ptype = 'frameloss' - query = self._session.query( - table.TblFrameloss.AvgFrameSize, - table.TblFrameloss.OfferedLoad).filter( - and_( - table.TblTestList.TaskID == taskid, - table.TblTestList.CaseTag == casetag, - table.TblTestList.Provider == provider, - table.TblTestList.Type == ptype, - table.TblTestList.TestID == table.TblFrameloss.TestID)) - return query.all() - - def query_frameloss_table(self, taskid, casetag, provider): - ptype = 'frameloss' - query = self._session.query( - table.TblFrameloss.AvgFrameSize, - table.TblFrameloss.Bandwidth, - table.TblFrameloss.OfferedLoad, - table.TblFrameloss.CPU, - table.TblFrameloss.MppspGhz, - table.TblFrameloss.MinimumLatency, - table.TblFrameloss.MaximumLatency, - table.TblFrameloss.AverageLatency).filter( - and_( - table.TblTestList.TaskID == taskid, - table.TblTestList.CaseTag == casetag, - table.TblTestList.Provider == provider, - table.TblTestList.Type == ptype, - table.TblTestList.TestID == table.TblFrameloss.TestID)) - return query.all() - - def query_frameloss_simpletable(self, taskid, casetag, provider): - ptype = 'frameloss' - query = self._session.query( - table.TblFrameloss.AvgFrameSize, - table.TblFrameloss.Bandwidth, - table.TblFrameloss.OfferedLoad, - table.TblFrameloss.CPU, - table.TblFrameloss.MppspGhz, - table.TblFrameloss.AverageLatency).filter( - and_( - table.TblTestList.TaskID == taskid, - table.TblTestList.CaseTag == casetag, - table.TblTestList.Provider == provider, - table.TblTestList.Type == ptype, - table.TblTestList.TestID == table.TblFrameloss.TestID)) - return query.all() - - def query_frameloss_avg(self, taskid, casetag, provider): - ptype = 'frameloss' - query = self._session.query( - table.TblFrameloss.AvgFrameSize, - table.TblFrameloss.AverageLatency).filter( - and_( - table.TblTestList.TaskID == taskid, - table.TblTestList.CaseTag == casetag, - table.TblTestList.Provider == provider, - table.TblTestList.Type == ptype, - table.TblTestList.TestID == table.TblFrameloss.TestID)) - return query.all() - - def query_latency_avg(self, taskid, casetag, provider): - ptype = 'latency' - query = self._session.query( - table.TblLatency.AvgFrameSize, - table.TblLatency.AverageLatency).filter( - and_( - table.TblTestList.TaskID == taskid, - table.TblTestList.CaseTag == casetag, - table.TblTestList.Provider == provider, - table.TblTestList.Type == ptype, - table.TblTestList.TestID == table.TblLatency.TestID)) - return query.all() - - def query_summary_table(self, taskid, casetag, provider, ptype): - if ptype in ['throughput', 'frameloss']: - qfunc = getattr(self, "query_%s_table" % (ptype)) - return qfunc(taskid, casetag, provider) - return [] - - def query_summary_simpletable(self, taskid, casetag, provider, ptype): - if ptype in ['throughput', 'frameloss']: - qfunc = getattr(self, "query_%s_simpletable" % (ptype)) - return qfunc(taskid, casetag, provider) - return [] - - def query_bandwidth(self, taskid, casetag, provider, ptype): - if ptype in ['throughput', 'frameloss']: - qfunc = getattr(self, "query_%s_bandwidth" % (ptype)) - return qfunc(taskid, casetag, provider) - return [] - - def query_load(self, taskid, casetag, provider, ptype): - if ptype in ['throughput', 'frameloss']: - qfunc = getattr(self, "query_%s_load" % (ptype)) - return qfunc(taskid, casetag, provider) - return [] - - def query_avglatency(self, taskid, casetag, provider, ptype): - if ptype in ['throughput', 'frameloss', 'latency']: - qfunc = getattr(self, "query_%s_avg" % (ptype)) - return qfunc(taskid, casetag, provider) - return [] - - def query_throughput_provider(self, taskid, casetag, provider): - query = self._session.query( - table.TblThroughput).filter( - and_( - table.TblTestList.CaseTag == casetag, - table.TblTestList.Provider == provider, - table.TblTestList.TaskID == taskid, - table.TblTestList.TestID == table.TblThroughput.TestID)) - return query.all() - - def query_frameloss_provider(self, taskid, casetag, provider): - query = self._session.query( - table.TblFrameloss).filter( - and_( - table.TblTestList.CaseTag == casetag, - table.TblTestList.Provider == provider, - table.TblTestList.TaskID == taskid, - table.TblTestList.TestID == table.TblFrameloss.TestID)) - return query.all() - - def query_latency_provider(self, taskid, casetag, provider): - query = self._session.query( - table.TblLatency).filter( - and_( - table.TblTestList.CaseTag == casetag, - table.TblTestList.Provider == provider, - table.TblTestList.TaskID == taskid, - table.TblTestList.TestID == table.TblLatency.TestID)) - return query.all() - - def query_case_type_count(self, taskid, casetag, ptype): - query = self._session.query( - table.TblTestList).filter( - and_( - table.TblTestList.CaseTag == casetag, - table.TblTestList.Type == ptype, - table.TblTestList.TaskID == taskid)) - - return query.count() - - def query_case_provider_count(self, taskid, casetag, provider): - query = self._session.query( - table.TblTestList).filter( - and_( - table.TblTestList.CaseTag == casetag, - table.TblTestList.Provider == provider, - table.TblTestList.TaskID == taskid)) - return query.count() - - def query_case_type_provider_count(self, taskid, casetag, provider, ptype): - query = self._session.query( - table.TblTestList).filter( - and_( - table.TblTestList.CaseTag == casetag, - table.TblTestList.Type == ptype, - table.TblTestList.Provider == provider, - table.TblTestList.TaskID == taskid)) - - return query.count() - - def query_exten_info(self, taskid): - query = self._session.query( - table.TblEXTInfo.EXTName, - table.TblEXTInfo.EXTContent, - table.TblEXTInfo.Description).filter( - table.TblEXTInfo.TaskID == taskid) - return query.all() - - -def unit_test(): - import time - dbase = DbManage() - - taskid = dbase.create_task("test", str( - time.ctime()), "this is a unit test") - dbase.add_host_2task( - taskid, - "hosta", - "hw82576", - "xxx", - "x", - "82599", - "ubuntu") - dbase.add_extent_2task(taskid, "CETH", "driver", "version 2.0") - dbase.add_extent_2task(taskid, "EVS", "switch", "version 3.0") - - testid = dbase.add_test_2task( - taskid, - "Tn-1", - 'udp', - "throughput", - "ovs", - None, - "netperf") - data = { - '64': { - 'OfferedLoad': 2, - 'PercentLoss': 3, - 'Bandwidth': 4, - 'MinimumLatency': 5, - 'MaximumLatency': 6, - 'AverageLatency': 7, - 'TxFrameCount': 8, - 'RxFrameCount': 9, - 'Duration': 10, - 'CPU': 11, - 'MppspGhz': 12, - } - } - dbase.add_data_2test(testid, data) - - testid = dbase.add_test_2task( - taskid, - "Tn-1", - 'udp', - "frameloss", - "ovs", - None, - "netperf") - data = { - '64': { - 'OfferedLoad': 2, - 'PercentLoss': 3, - 'Bandwidth': 4, - 'MinimumLatency': 5, - 'MaximumLatency': 6, - 'AverageLatency': 7, - 'TxFrameCount': 8, - 'RxFrameCount': 9, - 'Duration': 10, - 'CPU': 11, - 'MppspGhz': 12, - } - } - dbase.add_data_2test(testid, data) - - testid = dbase.add_test_2task( - taskid, - "Tn-1", - 'udp', - "latency", - "ovs", - None, - "netperf") - data = { - 64: { - 'MaximumLatency': 0.0, - 'AverageLatency': 0.0, - 'MinimumLatency': 0.0, - 'OfferedLoad': 0.0}, - 128: { - 'MaximumLatency': 0.0, - 'AverageLatency': 0.0, - 'MinimumLatency': 0.0, - 'OfferedLoad': 0.0}, - 512: { - 'MaximumLatency': 0.0, - 'AverageLatency': 0.0, - 'MinimumLatency': 0.0, - 'OfferedLoad': 0.0}, - 1024: { - 'MaximumLatency': 0.0, - 'AverageLatency': 0.0, - 'MinimumLatency': 0.0, - 'OfferedLoad': 0.0}} - dbase.add_data_2test(testid, data) - query = dbase.query_testlist(1, "Tn") - for item in query: - print item.Protocol - - query = dbase.query_testdata(1, "throughput") - print query - -if __name__ == '__main__': - unit_test() diff --git a/testsuites/vstf/vstf_scripts/vstf/controller/database/tables.py b/testsuites/vstf/vstf_scripts/vstf/controller/database/tables.py deleted file mode 100644 index 92f857a0..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/controller/database/tables.py +++ /dev/null @@ -1,305 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -from sqlalchemy import Column, Integer, String, Float, ForeignKey -from sqlalchemy.ext.declarative import declarative_base -from vstf.controller.database import constants as const - -Base = declarative_base() - - -class TblScenarioInfo(Base): - __tablename__ = "TblScenarioInfo" - ScenarioID = Column(Integer, primary_key=True) - ScenarioName = Column(String(const.SCENARIO_NAME_LEN), unique=True) - FigurePath = Column(String(const.FIGURE_PATH_LEN)) - Description = Column(String(const.DESC_LEN)) - - def __init__(self, ScenarioName, FigurePath, Description, **kwargs): - """ - :param ScenarioName: name of the scenario, like Tn - :param FigurePath: ?? - :param Description: desc of scenario table - """ - self.ScenarioName = ScenarioName - self.FigurePath = FigurePath - self.Description = Description - - def __repr__(self): - return "" % ( - self.ScenarioName, self.FigurePath, self.Description) - - -class TblCaseInfo(Base): - __tablename__ = "TblCaseInfo" - CaseID = Column(Integer, primary_key=True) - CaseTag = Column(String(const.CASE_TAG_LEN), unique=True) - CaseName = Column(String(const.CASE_NAME_LEN), unique=True) - ScenarioName = Column(String(const.SCENARIO_NAME_LEN)) - FigurePath = Column(String(const.FIGURE_PATH_LEN)) - Direction = Column(String(const.DIRECTION_LEN)) - Directiontag = Column(String(const.DIRECTION_LEN)) - Configure = Column(String(const.CONF_LEN)) - Description = Column(String(const.DESC_LEN)) - - def __init__(self, CaseTag, CaseName, - ScenarioName, FigurePath, Direction, Directiontag, - Configure, Description, **kwargs): - """ - :param CaseID: - :param CaseTag: ?? - :param CaseName: name of case, like tester-vm - :param ScenarioName: name of scenario, like Tn - :param FigurePath: - :param Direction: the test direction, Tx or Rx - :param Configure: - :param Description: desc of table case info - """ - # CaseID will auto builded by db - self.CaseTag = CaseTag - self.CaseName = CaseName - self.ScenarioName = ScenarioName - self.FigurePath = FigurePath - self.Direction = Direction - self.Directiontag = Directiontag - self.Configure = Configure - self.Description = Description - - def __repr__(self): - return "" % (self.CaseTag, self.CaseName, - self.ScenarioName, self.FigurePath, - self.Direction, self.Directiontag, self.Configure, - self.Description) - - -class TblHostInfo(Base): - __tablename__ = "TblHostInfo" - Index = Column(Integer, primary_key=True) - TaskID = Column(Integer, ForeignKey('TblTaskList.TaskID')) - HostName = Column(String(const.HOST_NAME_LEN)) - Server = Column(String(const.NORMAL_VAR_LEN1)) - CPU = Column(String(const.CPU_INFO_LEN)) - MEM = Column(String(const.NORMAL_VAR_LEN)) - NIC = Column(String(const.NORMAL_VAR_LEN)) - OS = Column(String(const.NORMAL_VAR_LEN)) - - def __init__(self, TaskID, HostName, Server, CPU, MEM, NIC, OS, **kwargs): - """table of host info - """ - self.TaskID = TaskID - self.HostName = HostName - self.Server = Server - self.CPU = CPU - self.MEM = MEM - self.NIC = NIC - self.OS = OS - - def __repr__(self): - return "" % (self.HostName, self.Server, self.CPU, self.MEM, self.NIC, self.OS) - - -class TblTaskList(Base): - __tablename__ = "TblTaskList" - TaskID = Column(Integer, primary_key=True) - TaskName = Column(String(const.NORMAL_VAR_LEN1)) - Date = Column(String(const.NORMAL_VAR_LEN1)) - EXTInfo = Column(String(const.EXT_INFO_LEN)) - - def __init__(self, TaskName, Date, EXTInfo="", **kwargs): - """Table of task""" - self.TaskName = TaskName - self.Date = Date - self.EXTInfo = EXTInfo - - def __repr__(self): - return "" % ( - self.TaskID, self.TaskName, self.Date, self.EXTInfo) - - -class TblTestList(Base): - __tablename__ = "TblTestList" - TestID = Column(Integer, primary_key=True) - TaskID = Column(Integer, ForeignKey('TblTaskList.TaskID')) - CaseTag = Column(String(const.CASE_TAG_LEN)) - Protocol = Column(String(const.PROTOCOL_LEN)) - Type = Column(String(const.TYPE_LEN)) - Switch = Column(String(const.SWITCH_LEN)) - Provider = Column(String(const.PROVIDER_LEN)) - Tools = Column(String(const.TOOLS_LEN)) - - def __init__( - self, - taskid, - casetag, - protocol, - typ, - switch, - provider, - tools, - **kwargs): - """Table of test""" - self.TaskID = taskid - self.CaseTag = casetag - self.Protocol = protocol - self.Type = typ - self.Switch = switch - self.Provider = provider - self.Tools = tools - - def __repr__(self): - return "" % ( - self.TaskID, self.CaseTag, self.Protocol, self.Type, self.Switch, self.Provider, self.Tools) - - -class TblThroughput(Base): - __tablename__ = "TblThroughput" - Index = Column(Integer, primary_key=True) - TestID = Column(Integer, ForeignKey('TblTestList.TestID')) - AvgFrameSize = Column(Integer) - OfferedLoad = Column(Float) - PercentLoss = Column(Float) - Bandwidth = Column(Float) - MinimumLatency = Column(Float) - MaximumLatency = Column(Float) - AverageLatency = Column(Float) - TxFrameCount = Column(Float) - RxFrameCount = Column(Float) - Duration = Column(Float) - CPU = Column(Float) - MppspGhz = Column(Float) - - def __init__(self, TestID, AvgFrameSize, - OfferedLoad, PercentLoss, Bandwidth, - MinimumLatency, MaximumLatency, AverageLatency, - TxFrameCount, RxFrameCount, Duration, - CPU, MppspGhz, **kwargs): - """table of throughput""" - self.TestID = TestID - self.AvgFrameSize = AvgFrameSize - self.OfferedLoad = OfferedLoad - self.PercentLoss = PercentLoss - self.Bandwidth = Bandwidth - self.MinimumLatency = MinimumLatency - self.MaximumLatency = MaximumLatency - self.AverageLatency = AverageLatency - self.TxFrameCount = TxFrameCount - self.RxFrameCount = RxFrameCount - self.Duration = Duration - self.CPU = CPU - self.MppspGhz = MppspGhz - - def __repr__(self): - return "" % (self.TestID, - self.AvgFrameSize, self.OfferedLoad, self.PercentLoss, - self.MinimumLatency, self.AverageLatency, self.MaximumLatency, - self.TxFrameCount, - self.RxFrameCount, self.Duration, self.CPU, self.MppspGhz, self.Bandwidth) - - -class TblFrameloss(Base): - __tablename__ = "TblFrameloss" - Index = Column(Integer, primary_key=True) - TestID = Column(Integer, ForeignKey('TblTestList.TestID')) - AvgFrameSize = Column(Integer) - OfferedLoad = Column(Float) - PercentLoss = Column(Float) - Bandwidth = Column(Float) - MinimumLatency = Column(Float) - MaximumLatency = Column(Float) - AverageLatency = Column(Float) - TxFrameCount = Column(Float) - RxFrameCount = Column(Float) - Duration = Column(Float) - CPU = Column(Float) - MppspGhz = Column(Float) - - def __init__(self, TestID, AvgFrameSize, - OfferedLoad, PercentLoss, Bandwidth, - MinimumLatency, MaximumLatency, AverageLatency, - TxFrameCount, RxFrameCount, Duration, - CPU, MppspGhz, **kwargs): - """table of frameloss""" - self.TestID = TestID - self.AvgFrameSize = AvgFrameSize - self.OfferedLoad = OfferedLoad - self.PercentLoss = PercentLoss - self.Bandwidth = Bandwidth - self.MinimumLatency = MinimumLatency - self.MaximumLatency = MaximumLatency - self.AverageLatency = AverageLatency - self.TxFrameCount = TxFrameCount - self.RxFrameCount = RxFrameCount - self.Duration = Duration - self.CPU = CPU - self.MppspGhz = MppspGhz - - def __repr__(self): - return "" % (self.TestID, - self.AvgFrameSize, self.OfferedLoad, self.PercentLoss, - self.MinimumLatency, self.AverageLatency, self.MaximumLatency, - self.TxFrameCount, - self.RxFrameCount, self.Duration, self.CPU, self.MppspGhz, self.Bandwidth) - - -class TblLatency(Base): - __tablename__ = "TblLatency" - Index = Column(Integer, primary_key=True) - TestID = Column(Integer, ForeignKey('TblTestList.TestID')) - AvgFrameSize = Column(Integer) - OfferedLoad = Column(Float) - MinimumLatency = Column(Float) - MaximumLatency = Column(Float) - AverageLatency = Column(Float) - - def __init__(self, TestID, AvgFrameSize, OfferedLoad, - MinimumLatency, MaximumLatency, AverageLatency, **kwargs): - """table of latency""" - self.TestID = TestID - self.AvgFrameSize = AvgFrameSize - self.OfferedLoad = OfferedLoad - self.MinimumLatency = MinimumLatency - self.MaximumLatency = MaximumLatency - self.AverageLatency = AverageLatency - - def __repr__(self): - return "" % (self.TestID, - self.AvgFrameSize, - self.OfferedLoad, - self.MinimumLatency, - self.AverageLatency, - self.MaximumLatency) - - -class TblEXTInfo(Base): - __tablename__ = "TblEXTInfo" - Index = Column(Integer, primary_key=True) - TaskID = Column(Integer) - EXTName = Column(String(const.NORMAL_VAR_LEN)) - EXTContent = Column(String(const.DESC_LEN)) - Description = Column(String(const.NORMAL_VAR_LEN1)) - - def __init__(self, TaskID, EXTName, EXTContent, Description, **kwargs): - """table extern info""" - self.TaskID = TaskID - self.EXTName = EXTName - self.EXTContent = EXTContent - self.Description = Description - - def __repr__(self): - return "" % ( - self.TaskID, self.EXTName, self.EXTContent, self.Version) diff --git a/testsuites/vstf/vstf_scripts/vstf/controller/env_build/__init__.py b/testsuites/vstf/vstf_scripts/vstf/controller/env_build/__init__.py deleted file mode 100644 index 83b8d15d..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/controller/env_build/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## diff --git a/testsuites/vstf/vstf_scripts/vstf/controller/env_build/cfg_intent_parse.py b/testsuites/vstf/vstf_scripts/vstf/controller/env_build/cfg_intent_parse.py deleted file mode 100644 index acc88d91..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/controller/env_build/cfg_intent_parse.py +++ /dev/null @@ -1,137 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -import json -import logging -from vstf.common.utils import randomMAC - -LOG = logging.getLogger(__name__) - - -class IntentParser(object): - - def __init__(self, cfg_file): - self.cfg_file = cfg_file - with file(cfg_file) as fp: - self.cfg_intent = json.load(fp) - - def parse_cfg_file(self): - self.set_default() - self.parse_br_type() - self.parse_vms_cfg() - return self.cfg_intent - - def set_default(self): - for host_cfg in self.cfg_intent['env-build']: - host_cfg.setdefault("scheme", 'libvirt') - host_cfg.setdefault("drivers", []) - host_cfg.setdefault("vms", []) - host_cfg.setdefault("bridges", []) - for vm_cfg in host_cfg["vms"]: - vm_cfg.setdefault("init_config", {}) - vm_cfg["init_config"].setdefault('amqp_port', 5672) - vm_cfg["init_config"].setdefault('amqp_user', "guest") - vm_cfg["init_config"].setdefault('amqp_passwd', "guest") - vm_cfg["init_config"].setdefault('amqp_id', "") - - def _nomornize_boolean(self, flag): - if isinstance(flag, bool): - return flag - lflag = flag.lower() - if lflag == 'true': - return True - if lflag == 'false': - return False - raise Exception("flag %s cannot be nomonized to bool value" % flag) - - def parse_br_type(self): - for host_cfg in self.cfg_intent['env-build']: - br_cfgs = host_cfg['bridges'] - br_type_set = set() - for br_cfg in br_cfgs: - br_type_set.add(br_cfg["type"]) - for vm_cfg in host_cfg['vms']: - for tap_cfg in vm_cfg['taps']: - br_type_set.add(tap_cfg["br_type"]) - if len(br_type_set) > 1: - raise Exception( - "specified more than one type of vswitchfor host:%s" % - host_cfg['ip']) - if len(br_type_set) > 0: - br_type = br_type_set.pop() - host_cfg['br_type'] = br_type - - def parse_vms_cfg(self): - for host_cfg in self.cfg_intent['env-build']: - vm_cfgs = host_cfg["vms"] - self._parse_vm_init_cfg(vm_cfgs) - self._parse_vm_ctrl_cfg(vm_cfgs) - for vm_cfg in vm_cfgs: - self._parse_taps_cfg(vm_cfg['taps']) - - def _parse_taps_cfg(self, tap_cfgs): - tap_name_set = set() - tap_mac_set = set() - count = 0 - for tap_cfg in tap_cfgs: - count += 1 - tap_name_set.add(tap_cfg["tap_mac"]) - tap_mac_set.add(tap_cfg["tap_name"]) - if len(tap_mac_set) != len(tap_name_set) != count: - raise Exception('config same tap_mac/tap_name for different taps') - LOG.info("tap_name_set: %s", tap_name_set) - LOG.info("tap_mac_set: %s", tap_mac_set) - - def _parse_vm_init_cfg(self, vm_cfgs): - count = 0 - ip_set = set() - gw_set = set() - required_options = {"ctrl_ip_setting", "ctrl_gw", "amqp_server"} - for vm_cfg in vm_cfgs: - init_cfg = vm_cfg["init_config"] - sub = required_options - set(init_cfg.keys()) - if sub: - raise Exception("unset required options:%s" % sub) - count += 1 - ip_set.add(init_cfg["ctrl_ip_setting"]) - gw_set.add(init_cfg["ctrl_gw"]) - if len(gw_set) > 1: - raise Exception("cannot config more than one gw for vm") - if len(ip_set) < count: - raise Exception("config same ip for different vm") - LOG.info("ip_set: %s", ip_set) - LOG.info("gw_set: %s", gw_set) - - def _parse_vm_ctrl_cfg(self, vm_cfgs): - count = 0 - ctrl_mac_set = set() - ctrl_br_set = set() - for vm_cfg in vm_cfgs: - count += 1 - vm_cfg.setdefault("ctrl_mac", randomMAC()) - vm_cfg.setdefault("ctrl_br", 'br0') - ctrl_mac_set.add(vm_cfg['ctrl_mac']) - ctrl_br_set.add(vm_cfg['ctrl_br']) - if len(ctrl_br_set) > 1: - raise Exception("cannot config more than one ctrl_br_set.") - if len(ctrl_mac_set) < count: - raise Exception("config same ctrl_mac_set for different vm.") - LOG.info("ctrl_mac_set: %s", ctrl_mac_set) - LOG.info("ctrl_br_set: %s", ctrl_br_set) - - -if __name__ == '__main__': - import argparse - - parser = argparse.ArgumentParser() - parser.add_argument('--config', help='config file to parse') - args = parser.parse_args() - logging.basicConfig(level=logging.INFO) - p = IntentParser(args.config) - LOG.info(json.dumps(p.parse_cfg_file(), indent=4)) diff --git a/testsuites/vstf/vstf_scripts/vstf/controller/env_build/env_build.py b/testsuites/vstf/vstf_scripts/vstf/controller/env_build/env_build.py deleted file mode 100644 index 40e25e9f..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/controller/env_build/env_build.py +++ /dev/null @@ -1,85 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -import logging - -from vstf.controller.fabricant import Fabricant -from vstf.rpc_frame_work.rpc_producer import Server -from vstf.controller.env_build.cfg_intent_parse import IntentParser - -LOG = logging.getLogger(__name__) - - -class EnvBuildApi(object): - - def __init__(self, conn, config_file): - LOG.info("welcome to EnvBuilder") - self.conn = conn - intent_parser = IntentParser(config_file) - self.cfg_intent = intent_parser.parse_cfg_file() - - def build(self): - LOG.info("start build") - for host_cfg in self.cfg_intent['env-build']: - rpc = Fabricant(host_cfg['ip'], self.conn) - rpc.build_env(timeout=1800, cfg_intent=host_cfg) - return True - - def clean(self): - for host_cfg in self.cfg_intent['env-build']: - rpc = Fabricant(host_cfg['ip'], self.conn) - rpc.clean_env(timeout=120) - return True - - def get_hosts(self): - result = [] - for host_cfg in self.cfg_intent['env-build']: - host = { - 'name': host_cfg['ip'], - 'nic': "82599ES 10-Gigabit" - } - result.append(host) - return result - - -class TransmitterBuild(object): - - def __init__(self, conn, config_file): - LOG.info("welcome to TransmitterBuild") - self.conn = conn - self._cfg_intent = config_file["transmitter-build"] - - def build(self): - LOG.info("start build") - for cfg in self.cfg_intent: - rpc = Fabricant(cfg['ip'], self.conn) - cfg.setdefault("scheme", 'transmitter') - rpc.build_env(timeout=1800, cfg_intent=cfg) - return True - - def clean(self): - for cfg in self.cfg_intent: - rpc = Fabricant(cfg['ip'], self.conn) - rpc.clean_env(timeout=10) - return True - - -if __name__ == "__main__": - import argparse - - parser = argparse.ArgumentParser() - parser.add_argument( - '--rpc_server', - help='rabbitmq server for deliver messages.') - parser.add_argument('--config', help='config file to parse') - args = parser.parse_args() - logging.basicConfig(level=logging.INFO) - conn = Server(args.rpc_server) - tn = EnvBuildApi(conn, args.config) - tn.build() diff --git a/testsuites/vstf/vstf_scripts/vstf/controller/env_build/env_collect.py b/testsuites/vstf/vstf_scripts/vstf/controller/env_build/env_collect.py deleted file mode 100644 index 7861ad31..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/controller/env_build/env_collect.py +++ /dev/null @@ -1,40 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -from vstf.rpc_frame_work import rpc_producer - - -class EnvCollectApi(object): - - def __init__(self, rb_mq_server): - """ - When use collect, a connection of rabbitmq is needed. - """ - super(EnvCollectApi, self).__init__() - if rb_mq_server is None: - raise Exception("The connection of rabbitmq is None.") - self.conn = rb_mq_server - - def collect_host_info(self, host): - msg = self.conn.make_msg("collect_host_info") - return self.conn.call(msg, host, timeout=2) - - def get_device_detail(self, host, nic_identity): - msg = self.conn.make_msg("get_device_detail", identity=nic_identity) - return self.conn.call(msg, host, timeout=2) - - def list_nic_devices(self, host): - msg = self.conn.make_msg("list_nic_devices") - return self.conn.call(msg, host, timeout=2) - - -if __name__ == "__main__": - conn = rpc_producer.Server("192.168.188.10") - c = EnvCollectApi(conn) - print c.collect_host_info("local") diff --git a/testsuites/vstf/vstf_scripts/vstf/controller/fabricant.py b/testsuites/vstf/vstf_scripts/vstf/controller/fabricant.py deleted file mode 100644 index 3f6978e4..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/controller/fabricant.py +++ /dev/null @@ -1,80 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -from vstf.rpc_frame_work import constant as const -import vstf.common.constants as cst - - -class Fabricant(object): - - def __init__(self, target, conn): - self.conn = conn - self.target = target - - self.all_commands = self.declare_commands - self.instance_commands() - - @property - def declare_commands(self): - driver = { - "install_drivers", - "clean_drivers", - "autoneg_on", - "autoneg_off", - "autoneg_query"} - - builder = {"build_env", "clean_env"} - - cpu = {"affctl_load", "affctl_list", "run_cpuwatch", "kill_cpuwatch"} - - perf = {"perf_run", "run_vnstat", "kill_vnstat", "force_clean"} - - device_mgr = { - "get_device_detail", - "list_nic_devices", - "get_device_verbose"} - - netns = {"clean_all_namespace", "config_dev", "recover_dev", "ping"} - - collect = {"collect_host_info"} - - cmdline = {"execute"} - - spirent = { - "send_packet", - "stop_flow", - "mac_learning", - "run_rfc2544suite", - "run_rfc2544_throughput", - "run_rfc2544_frameloss", - "run_rfc2544_latency"} - - equalizer = { - "get_numa_core", - "get_nic_numa", - "get_nic_interrupt_proc", - "get_vm_info", - "bind_cpu", - "catch_thread_info"} - - return driver | cpu | builder | perf | device_mgr | netns | cmdline | collect | spirent | equalizer - - def instance_commands(self): - for command in self.all_commands: - setattr(self, command, self.__transfer_msg(command)) - - def __transfer_msg(self, command): - def infunc(timeout=cst.TIMEOUT, **kwargs): - msg = self.conn.make_msg(command, **kwargs) - if self.target: - return self.conn.call(msg, self.target, timeout) - return None - - infunc.__name__ = command - return infunc diff --git a/testsuites/vstf/vstf_scripts/vstf/controller/reporters/__init__.py b/testsuites/vstf/vstf_scripts/vstf/controller/reporters/__init__.py deleted file mode 100644 index 83b8d15d..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/controller/reporters/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## diff --git a/testsuites/vstf/vstf_scripts/vstf/controller/reporters/mail/__init__.py b/testsuites/vstf/vstf_scripts/vstf/controller/reporters/mail/__init__.py deleted file mode 100644 index 83b8d15d..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/controller/reporters/mail/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## diff --git a/testsuites/vstf/vstf_scripts/vstf/controller/reporters/mail/mail.py b/testsuites/vstf/vstf_scripts/vstf/controller/reporters/mail/mail.py deleted file mode 100644 index c217f9e5..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/controller/reporters/mail/mail.py +++ /dev/null @@ -1,130 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -import smtplib -import logging -import os -from email.mime.application import MIMEApplication -from email.mime.text import MIMEText -from email.mime.multipart import MIMEMultipart - -LOG = logging.getLogger(__name__) -SRV = 'localhost' -USER = None -PASSWD = None - - -class Mail(object): - - def __init__(self, srv=SRV, user=USER, passwd=PASSWD): - self.srv = srv - self.user = USER - self.passwd = PASSWD - self._msg = MIMEMultipart('mixed') - - # addr type - self.TO = "To" - self.FROM = "From" - self.CC = "Cc" - self.BCC = "Bcc" - self.__addr_choice = [self.TO, self.FROM, self.CC, self.BCC] - - # text mode - self.HTML = "html" - self.PLAIN = "plain" - self.__mode = [self.HTML, self.PLAIN] - # self._charset = 'gb2312' - - # timeout - self.timeout = 10 - - def attach_addr(self, addr, addr_type): - """ - :param addr: a list of email address. - :param addr_type: must be one of [to, from, cc, bcc] - """ - if not addr or not isinstance(addr, list): - LOG.error("The addr must be a list") - return False - - if addr_type not in self.__addr_choice: - LOG.error("Not support addr type") - return False - - if not self._msg[addr_type]: - self._msg[addr_type] = ','.join(addr) - self._msg[addr_type].join(addr) - - def attach_title(self, title): - """Notice: - each time attach title, the old title will be covered. - """ - if title: - self._msg["Subject"] = str(title) - - def attach_text(self, text, mode): - if mode not in self.__mode: - LOG.error("The text mode not support.") - return False - - msg_alternative = MIMEMultipart('alternative') - msg_text = MIMEText(text, mode) - msg_alternative.attach(msg_text) - - return self._msg.attach(msg_alternative) - - def attach_files(self, files): - for _file in files: - part = MIMEApplication(open(_file, "rb").read()) - part.add_header( - 'Content-Disposition', - 'attachment', - filename=os.path.basename(_file)) - self._msg.attach(part) - - def send(self): - server = smtplib.SMTP(self.srv, timeout=self.timeout) - if self.user: - server.ehlo() - server.starttls() - server.ehlo() - server.login(self.user, self.passwd) - maillist = [] - if self._msg[self.TO]: - maillist += self._msg[self.TO].split(',') - if self._msg[self.CC]: - maillist += self._msg[self.CC].split(',') - if self._msg[self.BCC]: - maillist += self._msg[self.BCC].split(',') - ret = server.sendmail(self._msg[self.FROM].split(','), - maillist, self._msg.as_string()) - LOG.info("send mail ret:%s", ret) - server.close() - - -if __name__ == "__main__": - m = Mail() - m.attach_addr(["vstf_server@vstf.com"], m.FROM) - m.attach_addr(["test@test.com"], m.TO) - context = """ - - - - vstf - - - - hello vstf - - - - """ - m.attach_text(context, m.HTML) - m.attach_title("Email from xeson Check") - m.send() diff --git a/testsuites/vstf/vstf_scripts/vstf/controller/reporters/mail/sendmail.py b/testsuites/vstf/vstf_scripts/vstf/controller/reporters/mail/sendmail.py deleted file mode 100644 index 42f991a8..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/controller/reporters/mail/sendmail.py +++ /dev/null @@ -1,70 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - - -import logging -from vstf.controller.reporters.mail.mail import Mail -from vstf.controller.settings.mail_settings import MailSettings -LOG = logging.getLogger(__name__) - - -class SendMail(object): - - def __init__(self, mail_info): - self._mail_info = mail_info - - def send(self): - send = Mail(self._mail_info['server']['host'], - self._mail_info['server']['username'], - self._mail_info['server']['password'] - ) - send.attach_addr(self._mail_info['body']['from'], send.FROM) - send.attach_addr(self._mail_info['body']['to'], send.TO) - send.attach_addr(self._mail_info['body']['cc'], send.CC) - send.attach_addr(self._mail_info['body']['bcc'], send.CC) - - LOG.info(self._mail_info['body']) - - if 'attach' in self._mail_info['body']: - send.attach_files(self._mail_info['body']['attach']) - send.attach_text( - self._mail_info['body']['content'], - self._mail_info['body']['subtype']) - send.attach_title(self._mail_info['body']['subject']) - send.send() - - -def unit_test(): - mail_settings = MailSettings() - mail = SendMail(mail_settings.settings) - - attach_list = ['1', '2'] - mail_settings.set_attach(attach_list) - - context = """ - - - - vstf - - - - hello vstf - - - - """ - mail_settings.set_subtype('html') - mail_settings.set_content(context) - - mail.send() - - -if __name__ == '__main__': - unit_test() diff --git a/testsuites/vstf/vstf_scripts/vstf/controller/reporters/report/__init__.py b/testsuites/vstf/vstf_scripts/vstf/controller/reporters/report/__init__.py deleted file mode 100644 index 83b8d15d..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/controller/reporters/report/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## diff --git a/testsuites/vstf/vstf_scripts/vstf/controller/reporters/report/candy_generator.py b/testsuites/vstf/vstf_scripts/vstf/controller/reporters/report/candy_generator.py deleted file mode 100644 index a3285c9e..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/controller/reporters/report/candy_generator.py +++ /dev/null @@ -1,142 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -from vstf.controller.settings.template_settings import TemplateSettings -from vstf.controller.reporters.report.data_factory import TaskData -from vstf.controller.database.dbinterface import DbManage -import vstf.common.candy_text as candy -import logging -LOG = logging.getLogger(__name__) - - -class CandyGenerator(object): - - def __init__(self, task): - self._task = task - - def create(self, scenario): - context = {} - - sn = 1 - chapterid = 1 - name = candy.tuple2text(sn, candy.chapter, chapterid) - context[name] = self.create_env() - - sn += 1 - chapterid += 1 - name = candy.tuple2text(sn, candy.chapter, chapterid) - context[name] = self.create_scenario(scenario) - - template = TemplateSettings() - template.set_context(context) - LOG.info(template.settings) - - def create_all(self): - context = {} - - sn = 1 - chapterid = 1 - name = candy.tuple2text(sn, candy.chapter, chapterid) - context[name] = self.create_env() - - scenarios = self._task.common.get_scenariolist() - for scenario in scenarios: - sn += 1 - chapterid += 1 - name = candy.tuple2text(sn, candy.chapter, chapterid) - context[name] = self.create_scenario(scenario) - - template = TemplateSettings() - template.set_context(context) - LOG.info(template.settings) - - def create_env(self): - env = { - "01##title#1": ["System Environment"], - "02##table#2": self._task.common.get_systeminfo() - } - return env - - def create_scenario(self, scenario): - scenario_chapter = { - "01##title#1": ["Scenario Result"] - } - scenario_data = getattr(self._task, scenario) - test_list = scenario_data.get_testlist() - sectionid = 0 - sn = 1 - for test in test_list: - sn += 1 - sectionid += 1 - name = candy.tuple2text(sn, candy.section, sectionid) - testid = test.TestID - case = test.CaseTag.decode() - ttype = test.Type.decode() - - params_info = [ - " Case: " + case, - " Test tool: " + test.Tools.decode(), - " vSwitch: " + test.Switch.decode(), - " Protocol: " + test.Protocol.decode(), - " Type: " + ttype - ] - if ttype in ["frameloss", "throughput"]: - draw = { - "style": 1, - "node": candy.plot, - "data": scenario_data.get_framerate_chartdata(case, ttype) - } - table = scenario_data.get_ratedata(testid, ttype) - else: - draw = { - "style": 1, - "node": candy.chart, - "data": scenario_data.get_latency_bardata(case) - } - table = scenario_data.get_latency_tabledata(case) - test_section = self.create_test( - sectionid, params_info, table, draw) - scenario_chapter[name] = test_section - - return scenario_chapter - - def create_test(self, section, info, table, draw): - """ - - :rtype : dict - """ - sn = 7 - draw_name = candy.tuple2text(sn, draw["node"], draw["style"]) - case_section = { - "01##title#2": ["Test ID: %s" % section], - "02##paragraph#2": ["Parameter"], - "03##paragraph#3": info, - "04##paragraph#2": ["Result"], - "05##table#2": table, - "06##space#2": 2, - draw_name: draw["data"] - } - return case_section - - -def main(): - from vstf.common.log import setup_logging - setup_logging( - level=logging.DEBUG, - log_file="/var/log/vstf/vstf-candy.log", - clevel=logging.INFO) - - dbase = DbManage() - taskid = dbase.get_last_taskid() - task = TaskData(taskid, dbase) - creator = CandyGenerator(task) - - creator.create("Tn") -if __name__ == '__main__': - main() diff --git a/testsuites/vstf/vstf_scripts/vstf/controller/reporters/report/data_factory.py b/testsuites/vstf/vstf_scripts/vstf/controller/reporters/report/data_factory.py deleted file mode 100644 index ded94ebd..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/controller/reporters/report/data_factory.py +++ /dev/null @@ -1,508 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -from vstf.controller.database.dbinterface import DbManage -import vstf.common.constants as cst - - -class DataProvider(object): - - def __init__(self, taskid, dbase): - self._dbase = dbase - self._taskid = taskid - - -class CommonData(DataProvider): - - def get_taskname(self): - return self._dbase.query_taskname(self._taskid) - - def get_systeminfo(self): - systable = [ - ['Host', 'Server', 'CPU', 'MEM', 'NIC', 'OS'], - ] - query = self._dbase.query_task_host_list(self._taskid) - query = map(lambda x: list(x), query) - # rows = len(query) - # cols = len(zip(*query)) - # for i in range(rows): - # for j in range(cols): - # query[i][j] = query[i][j].replace('\",','\"\n') - systable += query - systable = map(lambda x: list(x), zip(*systable)) - return systable - - def get_introduct_tabledata(self): - result = [ - ["Type", "Case", "Name", "Direction", "Configure"] - ] - query = self._dbase.query_caseinfo() - result += map(lambda x: list(x), query) - return result - - def get_scenariolist(self): - query = self._dbase.query_scenariolist(self._taskid) - result = map(lambda x: list(x), zip(*query)) - if result: - return result[0] - else: - return result - - def is_scenario_start(self): - scenarioList = self.get_scenariolist() - print "scenarioList: ", scenarioList - if scenarioList: - return True - return False - - def get_casename(self, case): - return self._dbase.query_casename(case) - - def get_casefigure(self, case, tools): - return self._dbase.query_casefigure(case, tools) - - -class ScenarioData(DataProvider): - - def __init__(self, taskid, dbase, scenario): - print "ScenarioData in" - DataProvider.__init__(self, taskid, dbase) - self._scenario = scenario - - def get_test_tools(self, case): - query = self._dbase.query_casetools(self._taskid, case) - result = map(lambda x: list(x), query) - if result: - return result[0][0] - else: - return result - - def get_caselist(self): - query = self._dbase.query_caselist(self._taskid, self._scenario) - result = map(lambda x: list(x), zip(*query)) - if result: - return result[0] - else: - return result - - def get_testlist(self): - query = self._dbase.query_testlist(self._taskid, self._scenario) - result = [] - for item in query: - result.append(item.__dict__) - return query - - def is_provider_start(self, case, provider): - count = self._dbase.query_case_provider_count( - self._taskid, case, provider) - if count: - return True - return False - - def is_type_provider_start(self, case, provider, ptype): - count = self._dbase.query_case_type_provider_count( - self._taskid, case, provider, ptype) - if count: - return True - return False - - def is_type_start(self, case, ptype): - count = self._dbase.query_case_type_count(self._taskid, case, ptype) - if count: - return True - return False - - def is_throughput_start(self, case): - test_type = "throughput" - return self.is_type_start(case, test_type) - - def is_frameloss_start(self, case): - test_type = "frameloss" - return self.is_type_start(case, test_type) - - def is_latency_start(self, case): - test_type = "latency" - return self.is_type_start(case, test_type) - - def get_summary_throughput_data(self, case, provider): - test_type = "throughput" - return self.get_summary_tabledata(case, provider, test_type) - - def get_summary_frameLoss_data(self, case, provider): - test_type = "frameloss" - return self.get_summary_tabledata(case, provider, test_type) - - def get_summary_tabledata( - self, - case, - provider, - test_type, - table_type='pdf'): - table_head = [] - table_body = [] - type_title = { - "frameloss": "Load", - "throughput": "Load" - } - tools = self.get_test_tools(case) - if "spirent" in tools: - table_body = self._dbase.query_summary_table( - self._taskid, case, provider, test_type) - if 'pdf' == table_type: - table_head = [["FrameSize (byte)", - test_type, - "", - "", - "", - "Latency(uSec)", - "", - ""], - ["", - " Mpps ", - " " + type_title[test_type] + " (%) ", - "CPU Used (%)", - " Mpps/Ghz ", - " Min ", - " Max ", - " Avg "]] - else: - table_head = [["FrameSize (byte)", - " Mpps ", - " " + type_title[test_type] + " (%) ", - "CPU Used (%)", - " Mpps/Ghz ", - "MinLatency(uSec)", - "MaxLatency(uSec)", - "AvgLatency(uSec)"], - ] - else: - table_body = self._dbase.query_summary_simpletable( - self._taskid, case, provider, test_type) - if 'pdf' == table_type: - table_head = [["FrameSize (byte)", - test_type, - "", - "", - "", - "Latency(uSec)"], - ["", - " Mpps ", - " " + type_title[test_type] + " (%)", - "CPU Used (%)", - " Mpps/Ghz ", - " Avg "]] - else: - table_head = [["FrameSize (byte)", - " Mpps ", - " " + type_title[test_type] + " (%) ", - "CPU Used (%)", - " Mpps/Ghz ", - "AvgLatency(uSec)"], - ] - return table_head + table_body - - def get_ratedata(self, testid, test_type): - table_head = [["FrameSize (bytes)", - "Bandwidth(Mpps)", - "Load (%)", - "CPU Usage(%)", - "Mpps/Ghz", - "AvgLatency(uSec)"], - ] - query = self._dbase.query_testdata(testid, test_type) - table_body = [] - for item in query: - table_body.append([item.AvgFrameSize, - item.Bandwidth, - item.OfferedLoad, - item.CPU, - item.MppspGhz, - item.AverageLatency]) - result = [] - if table_body: - result = table_head + table_body - return result - - def get_tabledata(self, case, test_type, item): - type_dict = { - "FrameSize": "FrameSize (byte)", - "fastlink": "fastlink", - "l2switch": "l2switch", - "rdp": "kernel rdp", - None: "ovs", - "line": "line speed" - } - item_dict = { - "Percent": " ", - "Mpps": " ", - "Avg": " ", - } - table = [] - line_speed = 20.0 if case in ["Tn-2v", "Tn-2"] else 10.0 - - for provider in cst.PROVIDERS: - if self.is_provider_start(case, provider): - if item == 'Percent': - query = self._dbase.query_load( - self._taskid, case, provider, test_type) - elif item == 'Mpps': - query = self._dbase.query_bandwidth( - self._taskid, case, provider, test_type) - else: - query = self._dbase.query_avglatency( - self._taskid, case, provider, test_type) - query = map(lambda x: list(x), zip(*query)) - if query: - table_head = [[type_dict["FrameSize"]] + - map(lambda x: " %4d " % (x), query[0])] - if item == "Avg": - data = map( - lambda x: item_dict[item] + "%.1f" % - x + item_dict[item], query[1]) - else: - data = map( - lambda x: item_dict[item] + "%.2f" % - x + item_dict[item], query[1]) - if item == "Mpps": - line_table = map(lambda x: "%.2f" % ( - line_speed * 1000 / (8 * (x + 20))), query[0]) - table.append([type_dict[provider]] + data) - if table: - if item == "Mpps": - table.append([type_dict["line"]] + line_table) - table = table_head + table - return table - - def get_frameloss_tabledata(self, case, test_type): - item = "Percent" - table = self.get_tabledata(case, test_type, item) - return table - - def get_frameloss_chartdata(self, case, test_type): - result = self.get_frameloss_tabledata(case, test_type) - result = map(list, zip(*result)) - return result - - def get_framerate_tabledata(self, case, test_type): - item = "Mpps" - table = self.get_tabledata(case, test_type, item) - return table - - def get_framerate_chartdata(self, case, test_type): - result = self.get_framerate_tabledata(case, test_type) - result = map(list, zip(*result)) - return result - - def get_latency_tabledata(self, case): - test_type = "latency" - item = "Avg" - table = self.get_tabledata(case, test_type, item) - return table - - def get_latency_chartdata(self, case): - result = self.get_latency_tabledata(case) - result = map(list, zip(*result)) - return result - - def get_latency_bardata(self, case): - table_data = self.get_latency_tabledata(case) - result = [] - if table_data: - ytitle = "Average Latency (uSec)" - category_names = map(lambda x: "FS:%4d" % - int(float(x)) + "LOAD:50", table_data[0][1:]) - bar_ = map(lambda x: x[0], table_data[1:]) - data = map(lambda x: x[1:], table_data[1:]) - result = [ytitle, category_names, bar_, data] - return result - - def get_bardata(self, case, provider, test_type): - if test_type == "latency": - query = self._dbase.query_avglatency( - self._taskid, case, provider, test_type) - item = "Avg" - else: - query = self._dbase.query_load( - self._taskid, case, provider, test_type) - item = "Percent" - - title_dict = { - "Avg": "Latency (uSec)", - "Percent": test_type + " (%)" - } - name_dict = { - "Avg": " LOAD:50", - "Percent": " OF:100 " - } - color_dict = { - "Avg": "latency", - "Percent": "loss" - } - ytitle = title_dict[item] - query = map(lambda x: list(x), zip(*query)) - result = [] - if query: - category_names = map( - lambda x: "FS:%4d" % - x + name_dict[item], query[0]) - data = query[1:] - bar_ = [color_dict[item]] - result = [ytitle, category_names, bar_, data] - return result - - -class TaskData(object): - - def __init__(self, taskid, dbase): - self.__common = CommonData(taskid, dbase) - scenario_list = self.__common.get_scenariolist() - scenario_dic = {} - for scenario in scenario_list: - scenario_dic[scenario] = ScenarioData(taskid, dbase, scenario) - self.__dict__.update(scenario_dic) - - @property - def common(self): - return self.__common - - -class HistoryData(DataProvider): - - def get_data(self, task_list, case, provider, ttype, item): - """ - @provider in ["fastlink", "rdp", "l2switch", ""] - @ttype in ["throughput", "frameloss", "latency"] - @item in ["avg", "ratep", "load"] - """ - table = [] - table_head = [] - datas = [] - sizes = [] - for taskid in task_list: - if item == 'ratep': - query = self._dbase.query_bandwidth( - taskid, case, provider, ttype) - else: - query = self._dbase.query_avglatency( - taskid, case, provider, ttype) - - if query: - data = {} - for size, value in query: - data[size] = value - sizes.extend(data.keys()) - sizes = sorted({}.fromkeys(sizes).keys()) - datas.append({taskid: data}) - - result = [] - for data in datas: - print data - taskid = data.keys()[0] - data_th = self._dbase.query_taskdate(taskid) - testdata = data[taskid] - item = [data_th] - for size in sizes: - item.append(str(testdata.get(size, ''))) - result.append(item) - - if result: - head_th = "FrameSize (byte)" - table_head = [[head_th] + map(lambda x: " %4d " % (x), sizes)] - table = table_head + result - - return table - - def get_tasklist(self, count=5): - task_list = [] - query = self._dbase.query_tasklist() - if query: - for item in query: - if item.TaskID <= self._taskid: - task_list.append(item.TaskID) - - task_list = task_list[-count:] - return task_list - - def get_history_info(self, case): - provider_dict = { - "fastlink": "Fast Link ", - "l2switch": "L2Switch ", - "rdp": "Kernel RDP "} - ttype_dict = { - "throughput": "Throughput Testing ", - "frameloss": "Frame Loss Testing ", - "latency": "Latency Testing " - } - - items_dict = { - "ratep": "RX Frame Rate(Mpps) ", - "avg": "Average Latency (uSec) " - } - - task_list = self.get_tasklist() - result = [] - - for ttype in cst.TTYPES: - content = {} - if ttype == "latency": - item = "avg" - else: - item = "ratep" - - for provider in cst.PROVIDERS: - table_data = self.get_data( - task_list, case, provider, ttype, item) - if table_data: - data = { - "title": provider_dict[provider] + items_dict[item], - "data": table_data - } - content["title"] = ttype_dict[ttype] - content.setdefault("data", []) - content["data"].append(data) - if content: - result.append(content) - print result - return result - - -def unit_test(): - dbase = DbManage() - taskid = dbase.get_last_taskid() - hdata = HistoryData(taskid, dbase) - task_list = hdata.get_tasklist() - - cdata = CommonData(taskid, dbase) - scenario_list = cdata.get_scenariolist() - print scenario_list - - scenario = "Tn" - sdata = ScenarioData(taskid, dbase, scenario) - - case_list = sdata.get_caselist() - print case_list - - case = "Tn-1" - - ttypes = ["throughput", "frameloss"] - items = ["ratep", "load"] - - for provider in cst.PROVIDERS: - for ttype in ttypes: - for item in items: - print provider - print ttype - print item - print hdata.get_data(task_list, case, provider, ttype, item) - - hdata.get_history_info(case) - - -if __name__ == '__main__': - unit_test() diff --git a/testsuites/vstf/vstf_scripts/vstf/controller/reporters/report/html/__init__.py b/testsuites/vstf/vstf_scripts/vstf/controller/reporters/report/html/__init__.py deleted file mode 100644 index 83b8d15d..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/controller/reporters/report/html/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## diff --git a/testsuites/vstf/vstf_scripts/vstf/controller/reporters/report/html/html_base.py b/testsuites/vstf/vstf_scripts/vstf/controller/reporters/report/html/html_base.py deleted file mode 100644 index 02606b4b..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/controller/reporters/report/html/html_base.py +++ /dev/null @@ -1,44 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - - -import os -import vstf.common.pyhtml as pyhtm - - -class HtmlBase(object): - - def __init__(self, provider): - self._page = pyhtm.PyHtml('Html Text') - self._provider = provider - - def save(self, ofile): - if ofile: - os.system('rm -rf %s' % ofile) - self._page.output(ofile) - - def as_string(self): - return self._page.as_string() - - def add_table(self, data): - if data and zip(*data): - self._page.add_table(data) - - def add_style(self): - style = self._provider.get_style - self._page.add_style(style) - - def create(self, ofile='text.html'): - self.add_style() - self.create_story() - self.save(ofile) - return self.as_string() - - def create_story(self): - raise NotImplementedError("abstract HtmlBase") diff --git a/testsuites/vstf/vstf_scripts/vstf/controller/reporters/report/html/htmlcreator.py b/testsuites/vstf/vstf_scripts/vstf/controller/reporters/report/html/htmlcreator.py deleted file mode 100644 index f866f185..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/controller/reporters/report/html/htmlcreator.py +++ /dev/null @@ -1,88 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - - -import logging - -import vstf.common.candy_text as candy -from vstf.controller.reporters.report.provider.html_provider import HtmlProvider -from vstf.controller.settings.template_settings import TemplateSettings -from vstf.controller.settings.html_settings import HtmlSettings -from vstf.controller.reporters.report.html.html_base import HtmlBase, pyhtm - -LOG = logging.getLogger(__name__) - - -class HtmlCreator(HtmlBase): - - def create_story(self): - self.add_context() - - def add_context(self): - context = self._provider.get_context - self._raw_context(context) - - def _raw_context(self, context, ci=0, si=0, ui=0, level=-1): - _story = [] - for key, value in sorted(context.items()): - LOG.info(key) - LOG.info(value) - _sn, _node, _style = candy.text2tuple(key) - if _node in candy.dom: - if _node == candy.chapter: - ci = _style - elif _node == candy.section: - si = _style - else: - ui = _style - self._raw_context(value, ci, si, ui, level + 1) - - else: - LOG.info("node: %s %s" % (_node, candy.title)) - if _node == candy.title: - assert value - if level in range(len(candy.dom)): - if level == 0: - value[0] = "Chapter %s %s" % (ci, value[0]) - for title in value: - self._page << pyhtm.H2(title) - elif level == 1: - value[0] = "%s.%s %s" % (ci, si, value[0]) - for title in value: - self._page << pyhtm.H3(title) - else: - value[0] = "%s.%s.%s %s" % (ci, si, ui, value[0]) - for title in value: - self._page << pyhtm.H3(title) - - elif _node == candy.table: - self.add_table(value) - elif _node == candy.paragraph: - for para in value: - para = pyhtm.space(2) + para - self._page << pyhtm.P(para) - - -def unit_test(): - from vstf.common.log import setup_logging - setup_logging( - level=logging.DEBUG, - log_file="/var/log/html-creator.log", - clevel=logging.INFO) - - out_file = "vstf_report.html" - - info = TemplateSettings() - html_settings = HtmlSettings() - provider = HtmlProvider(info.settings, html_settings.settings) - reporter = HtmlCreator(provider) - reporter.create(out_file) - -if __name__ == '__main__': - unit_test() diff --git a/testsuites/vstf/vstf_scripts/vstf/controller/reporters/report/pdf/__init__.py b/testsuites/vstf/vstf_scripts/vstf/controller/reporters/report/pdf/__init__.py deleted file mode 100644 index 83b8d15d..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/controller/reporters/report/pdf/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## diff --git a/testsuites/vstf/vstf_scripts/vstf/controller/reporters/report/pdf/element.py b/testsuites/vstf/vstf_scripts/vstf/controller/reporters/report/pdf/element.py deleted file mode 100644 index 6622281b..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/controller/reporters/report/pdf/element.py +++ /dev/null @@ -1,821 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - - -__doc__ = """ -it contains the base element for pdf -eImage is used to draw picture on the pdf document -eDataTable is used to draw table on the pdf document -eGraphicsTable is used to draw plot on the pdf document -eParagraph is used to draw text on the pdf document -""" -from reportlab.platypus import Image, Table -from reportlab.graphics.shapes import Drawing -from reportlab.graphics.charts.lineplots import LinePlot -from reportlab.graphics.charts.linecharts import HorizontalLineChart -from reportlab.platypus.paragraph import Paragraph -from reportlab.graphics.widgets.markers import makeMarker -from reportlab.graphics.charts.legends import Legend -from reportlab.graphics.charts.textlabels import Label -from reportlab.graphics.charts.axes import XValueAxis -from reportlab.graphics.shapes import Group -from reportlab.graphics.charts.barcharts import VerticalBarChart -from vstf.controller.reporters.report.pdf.styles import * - - -class eImage(Image): - """ an image(digital picture)which contains the function of auto zoom picture """ - - def __init__( - self, - filename, - width=None, - height=None, - kind='direct', - mask="auto", - lazy=1, - hAlign='CENTRE', - vAlign='BOTTOM'): - Image.__init__(self, filename, None, None, kind, mask, lazy) - print height, width - print self.drawHeight, self.drawWidth - if self.drawWidth * height > self.drawHeight * width: - self.drawHeight = width * self.drawHeight / self.drawWidth - self.drawWidth = width - else: - self.drawWidth = height * self.drawWidth / self.drawHeight - self.drawHeight = height - self.hAlign = hAlign - self.vAlign = vAlign - print self.drawHeight, self.drawWidth - - -class eTable(object): - """ an abstract table class, which is contains the base functions to create table """ - - def __init__(self, data, style=TableStyle(name="default")): - self._tablestyle = style - self._table = [] - self._spin = False - self._colWidths = None - self._data = self.analysisData(data) - if self._data: - self.create() - - def analysisData(self, data): - raise NotImplementedError("abstract eTable") - - def create(self): - self._table = Table(self._data, style=self._style, splitByRow=1) - self._table.hAlign = self._tablestyle.table_hAlign - self._table.vAlign = self._tablestyle.table_vAlign - self._table.colWidths = self._tablestyle.table_colWidths - if self._spin or self._colWidths: - self._table.colWidths = self._colWidths - self._table.rowHeights = self._tablestyle.table_rowHeights - - @property - def table(self): - return self._table - - -class eCommonTable(eTable): - - def analysisData(self, data): - self._style = [ - ('ALIGN', (0, 0), (-1, -1), 'CENTER'), - ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'), - ('GRID', (0, 0), (-1, -1), 0.5, colors.grey), - ('BOX', (0, 0), (-1, -1), 1.2, colors.black) - ] - return data - - -class eConfigTable(eTable): - - def analysisData(self, data): - self._style = [ - ('ALIGN', (0, 0), (-1, -1), 'CENTER'), - ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'), - ('GRID', (0, 0), (-1, -1), 0.5, colors.grey), - ('BOX', (0, 0), (-1, -1), 1, colors.black), - ('SPAN', (2, 0), (3, 0)), - ('SPAN', (2, 1), (3, 1)), - ('SPAN', (2, 8), (3, 8)), - ('SPAN', (2, 9), (3, 9)), - ('SPAN', (2, 10), (3, 10)), - ('SPAN', (0, 0), (0, 7)), - ('SPAN', (0, 8), (0, 10)), - ('SPAN', (0, 11), (0, 19)), - ('SPAN', (1, 2), (1, 6)), - ('SPAN', (1, 12), (1, 13)), - ('SPAN', (1, 14), (1, 16)), - ('SPAN', (1, 17), (1, 19)), - ('SPAN', (2, 3), (2, 6)) - ] - return data - - -class eSummaryTable(eTable): - - def analysisData(self, data): - self._style = [ - ('ALIGN', (0, 0), (-1, -1), 'CENTER'), - ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'), - ('GRID', (0, 0), (-1, -1), 0.5, colors.grey), - ('BOX', (0, 0), (-1, -1), 1, colors.black), - ('SPAN', (0, 0), (0, 1)), - ('SPAN', (1, 0), (4, 0)), - ('SPAN', (5, 0), (-1, 0)) - ] - return data - - -class eGitInfoTable(eTable): - - def analysisData(self, data): - self._style = [ - ('ALIGN', (0, 0), (-1, -1), 'CENTER'), - ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'), - ('GRID', (0, 0), (-1, -1), 0.5, colors.grey), - ('BOX', (0, 0), (-1, -1), 1, colors.black), - ('SPAN', (0, 0), (0, 2)), - ('SPAN', (0, 3), (0, 5)), - ('SPAN', (0, 6), (0, 8)) - ] - return data - - -class eScenarioTable(eTable): - - def analysisData(self, data): - self._style = [ - ('ALIGN', (0, 0), (-1, -1), 'CENTER'), - ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'), - ('GRID', (0, 0), (-1, -1), 0.5, colors.grey), - ('BOX', (0, 0), (-1, -1), 1, colors.black), - ('ALIGN', (2, 1), (-1, -1), 'LEFT'), - ('SPAN', (0, 1), (0, 6)), - ('SPAN', (0, 7), (0, 12)), - ('SPAN', (0, 13), (0, 16)), - ('SPAN', (0, 17), (0, 20)) - ] - return data - - -class eOptionsTable(eTable): - - def analysisData(self, data): - self._style = [ - ('ALIGN', (0, 0), (-1, -1), 'CENTER'), - ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'), - ('GRID', (0, 0), (-1, -1), 0.5, colors.grey), - ('BOX', (0, 0), (-1, -1), 1, colors.black), - ('SPAN', (2, 0), (4, 0)), - ('SPAN', (2, 1), (4, 1)), - ('SPAN', (0, 0), (0, -1)), - ('SPAN', (1, 2), (1, 16)), - ('SPAN', (1, 17), (1, 19)), - ('SPAN', (1, 20), (1, 22)), - ('SPAN', (1, 23), (1, 24)), - ('SPAN', (2, 2), (2, 4)), - ('SPAN', (2, 5), (2, 12)), - ('SPAN', (2, 13), (2, 16)), - ('SPAN', (2, 17), (2, 19)), - ('SPAN', (2, 20), (2, 22)), - ('SPAN', (2, 23), (2, 24)) - ] - return data - - -class eProfileTable(eTable): - - def analysisData(self, data): - self._style = [ - ('ALIGN', (0, 0), (-1, -1), 'CENTER'), - ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'), - ('GRID', (0, 0), (-1, -1), 0.5, colors.grey), - ('BOX', (0, 0), (-1, -1), 1, colors.black), - ('SPAN', (0, 1), (0, -1)), - ('SPAN', (1, 0), (2, 0)), - ] - return data - - -class eDataTable(eTable): - - def analysisData(self, data): - result = data - self._style = [ - ('ALIGN', (0, 0), (-1, -1), 'CENTER'), - ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'), - ('LEADING', (0, 0), (-1, -1), 18), - ('GRID', (0, 0), (-1, -1), 0.5, colors.grey), - ('BOX', (0, 0), (-1, -1), 1, colors.black), - ('LINEBEFORE', (1, 0), (1, -1), 0.8, colors.black), - # ('LINEBEFORE', (3, 0), (3, -1), 1, colors.black), - # ('LINEBEFORE', (5, 0), (5, -1), 1, colors.black), - ('LINEBELOW', (0, 0), (-1, 0), 0.8, colors.black), - # ('SPAN', (0, 0), (0, 1)), - # ('SPAN', (1, 0), (2, 0)), - # ('SPAN', (3, 0), (4, 0)) - ] - if self._spin is True: - print "start spin" - result = map(list, zip(*result)) - style = [] - for value in self._style: - value = list(value) - value[1] = (value[1][1], value[1][0]) - value[2] = (value[2][1], value[2][0]) - if value[0] == 'LINEBELOW': - value[0] = 'LINEAFTER' - elif value[0] == 'LINEBEFORE': - value[0] = 'LINEABOVE' - value = tuple(value) - style.append(value) - self._style = style - return result - - -class eGraphicsTable(eTable): - - def analysisData(self, data): - self._style = [ - ('ALIGN', (0, 0), (-1, -1), 'CENTER'), - ('VALIGN', (0, 0), (-1, -1), 'MIDDLE') - ] - return data - - -class noScaleXValueAxis(XValueAxis): - - def __init__(self): - XValueAxis.__init__(self) - - def makeTickLabels(self): - g = Group() - if not self.visibleLabels: - return g - - f = self._labelTextFormat # perhaps someone already set it - if f is None: - f = self.labelTextFormat or (self._allIntTicks() and '%.0f' or str) - elif f is str and self._allIntTicks(): - f = '%.0f' - elif hasattr(f, 'calcPlaces'): - f.calcPlaces(self._tickValues) - post = self.labelTextPostFormat - scl = self.labelTextScale - pos = [self._x, self._y] - d = self._dataIndex - pos[1 - d] = self._labelAxisPos() - labels = self.labels - if self.skipEndL != 'none': - if self.isXAxis: - sk = self._x - else: - sk = self._y - if self.skipEndL == 'start': - sk = [sk] - else: - sk = [sk, sk + self._length] - if self.skipEndL == 'end': - del sk[0] - else: - sk = [] - - nticks = len(self._tickValues) - nticks1 = nticks - 1 - for i, tick in enumerate(self._tickValues): - label = i - nticks - if label in labels: - label = labels[label] - else: - label = labels[i] - if f and label.visible: - v = self.scale(i) - if sk: - for skv in sk: - if abs(skv - v) < 1e-6: - v = None - break - if v is not None: - if scl is not None: - t = tick * scl - else: - t = tick - if isinstance(f, str): - txt = f % t - elif isSeq(f): - # it's a list, use as many items as we get - if i < len(f): - txt = f[i] - else: - txt = '' - elif hasattr(f, '__call__'): - if isinstance(f, TickLabeller): - txt = f(self, t) - else: - txt = f(t) - else: - raise ValueError('Invalid labelTextFormat %s' % f) - if post: - txt = post % txt - pos[d] = v - label.setOrigin(*pos) - label.setText(txt) - - # special property to ensure a label doesn't project beyond - # the bounds of an x-axis - if self.keepTickLabelsInside: - if isinstance( - self, XValueAxis): # not done yet for y axes - a_x = self._x - if not i: # first one - x0, y0, x1, y1 = label.getBounds() - if x0 < a_x: - label = label.clone(dx=label.dx + a_x - x0) - if i == nticks1: # final one - a_x1 = a_x + self._length - x0, y0, x1, y1 = label.getBounds() - if x1 > a_x1: - label = label.clone( - dx=label.dx - x1 + a_x1) - g.add(label) - - return g - - def ___calcScaleFactor(self): - """Calculate the axis' scale factor. - This should be called only *after* the axis' range is set. - Returns a number. - """ - self._scaleFactor = self._length / (len(self._tickValues) + 1) - return self._scaleFactor - - def scale(self, value): - """Converts a numeric value to a plotarea position. - The chart first configures the axis, then asks it to - """ - assert self._configured, "Axis cannot scale numbers before it is configured" - if value is None: - value = 0 - # this could be made more efficient by moving the definition of org and - # sf into the configuration - org = (self._x, self._y)[self._dataIndex] - sf = self._length / (len(self._tickValues) + 1) - if self.reverseDirection: - sf = -sf - org += self._length - return org + sf * (value + 1) - - -class noScaleLinePlot(LinePlot): - - def __init__(self): - LinePlot.__init__(self) - self.xValueAxis = noScaleXValueAxis() - - def calcPositions(self): - """Works out where they go. - - Sets an attribute _positions which is a list of - lists of (x, y) matching the data. - """ - self._seriesCount = len(self.data) - self._rowLength = max(map(len, self.data)) - - self._positions = [] - for rowNo in range(len(self.data)): - line = [] - len_row = len(self.data[rowNo]) - for colNo in range(len_row): - datum = self.data[rowNo][colNo] # x, y value - x = self.x + self.width / (len_row + 1) * (colNo + 1) - self.xValueAxis.labels[colNo].x = self.x + \ - self.width / (len_row + 1) * (colNo + 1) - y = self.yValueAxis.scale(datum[1]) - # print self.width, " ", x - line.append((x, y)) - self._positions.append(line) - - -# def _innerDrawLabel(self, rowNo, colNo, x, y): -# return None -class eLinePlot(object): - - def __init__(self, data, style): - self._lpstyle = style - self._linename = data[0] - self._data = self.analysisData(data[1:]) - if self._data: - self.create() - - @property - def draw(self): - return self._draw - - def analysisData(self, data): - columns = len(data) - # print data - data = map(list, zip(*data)) - rows = len(data) - - for i in range(rows): - for j in range(columns): - data[i][j] = float(data[i][j]) - self._linename = self._linename[1:] - """ - delcnt = 0 - delrows = [] - for i in range(columns): - delrows.append(0.0) - del_line = [self._linename[0]] - for i in range(rows): - for j in range(columns): - data[i][j] = float(data[i][j]) - if data[i] == delrows: - delcnt += 1 - del_line.append(self._linename[i]) - for i in range(delcnt): - data.remove(delrows) - for name in del_line: - self._linename.remove(name) - - rows = len(data) - """ - # print rows - # print data - xvalueSteps = data[0] - xvalueMin = data[0][0] - xvalueMax = data[0][0] - yvalueMin = data[1][0] - yvalueMax = data[1][0] - yvalueSteps = [] - result = [] - for j in range(columns): - if xvalueMin > data[0][j]: - xvalueMin = data[0][j] - if xvalueMax < data[0][j]: - xvalueMax = data[0][j] - - for i in range(rows - 1): - lst = [] - for j in range(columns): - lst.append((data[0][j], data[i + 1][j])) - if yvalueMin > data[i + 1][j]: - yvalueMin = data[i + 1][j] - if yvalueMax < data[i + 1][j]: - yvalueMax = data[i + 1][j] - yvalueSteps.append(int(data[i + 1][j] * 2.5) / 2.5) - result.append(tuple(lst)) - xvalueMin = int(xvalueMin) / 100 * 100 - xvalueMax = int(xvalueMax) / 100 * 100 + 200 - yvalueMin = int(yvalueMin) * 1.0 - 1 - if yvalueMin < 0: - yvalueMin = 0.0 - yvalueMax = int(yvalueMax) + 2.0 - yvalueSteps.append(yvalueMin) - yvalueSteps.append(yvalueMax) - yvalueSteps = {}.fromkeys(yvalueSteps).keys() - - self._xvalue = (xvalueMin, xvalueMax, xvalueSteps) - self._yvalue = (yvalueMin, yvalueMax, yvalueSteps) - print result - return result - - def create(self): - lpw = self._lpstyle.width - lph = self._lpstyle.height - draw = Drawing(lpw, lph) - line_cnts = len(self._linename) - # lp = noScaleLinePlot() - lp = LinePlot() - lg_line = (line_cnts + 3) / 4 - lp.x = self._lpstyle.left - lp.y = self._lpstyle.bottom - - lp.height = lph - self._lpstyle.bottom * (lg_line + 1.5) - lp.width = lpw - lp.x * 2 - lp.data = self._data - lp.joinedLines = 1 - lp.strokeWidth = self._lpstyle.strokeWidth - line_cnts = len(self._data) - sytle_cnts = len(self._lpstyle.linestyle) - color_paris = [] - for i in range(line_cnts): - styleIndex = i % sytle_cnts - lp.lines[i].strokeColor = self._lpstyle.linestyle[styleIndex][0] - lp.lines[i].symbol = makeMarker( - self._lpstyle.linestyle[styleIndex][1]) - lp.lines[i].strokeWidth = self._lpstyle.linestyle[styleIndex][2] - color_paris.append( - (self._lpstyle.linestyle[styleIndex][0], self._linename[i])) - # lp.lineLabels[i].strokeColor = self._lpstyle.linestyle[styleIndex][0] - - lp.lineLabelFormat = self._lpstyle.format[0] - - lp.strokeColor = self._lpstyle.strokeColor - - lp.xValueAxis.valueMin, lp.xValueAxis.valueMax, lp.xValueAxis.valueSteps = self._xvalue - # valueMin, valueMax, xvalueSteps = self._xvalue - # lp.xValueAxis.valueStep = (lp.xValueAxis.valueMax - lp.xValueAxis.valueMin)/len(xvalueSteps) - # lp.xValueAxis.valueSteps = map(lambda x: str(x), xvalueSteps) - - lp.yValueAxis.valueMin, lp.yValueAxis.valueMax, lp.yValueAxis.valueSteps = self._yvalue - - # lp.xValueAxis.forceZero = 0 - # lp.xValueAxis.avoidBoundFrac = 1 - # lp.xValueAxis.tickDown = 3 - # lp.xValueAxis.visibleGrid = 1 - # lp.xValueAxis.categoryNames = '64 256 512 1400 1500 4096'.split(' ') - - lp.xValueAxis.labelTextFormat = self._lpstyle.format[1] - lp.yValueAxis.labelTextFormat = self._lpstyle.format[2] - - delsize = int(lp.xValueAxis.valueMax / 2000) - lp.xValueAxis.labels.fontSize = self._lpstyle.labelsfont - lp.xValueAxis.labels.angle = 25 - - lp.yValueAxis.labels.fontSize = self._lpstyle.labelsfont - lp.lineLabels.fontSize = self._lpstyle.labelsfont - delsize - draw.add(lp) - - lg = Legend() - lg.colorNamePairs = color_paris - lg.fontName = 'Helvetica' - lg.fontSize = 7 - - lg.x = self._lpstyle.left * 3 - lg.y = self._lpstyle.bottom * (1 + lg_line) + lp.height - - lg.dxTextSpace = 5 - lg.dy = 5 - lg.dx = 20 - lg.deltax = 60 - lg.deltay = 0 - lg.columnMaximum = 1 - lg.alignment = 'right' - draw.add(lg) - self._draw = draw - - -class eHorizontalLineChart(object): - - def __init__(self, data, style): - self._lcstyle = style - if len(data) < 1: - return - self._linename = data[0] - self._data = self.analysisData(data[1:]) - if self._data: - self.create() - - @property - def draw(self): - return self._draw - - def analysisData(self, data): - columns = len(data) - data = map(list, zip(*data)) - self._catNames = data[0] - self._linename = self._linename[1:] - data = data[1:] - rows = len(data) - - yvalueMin = float(data[0][0]) - yvalueMax = float(data[0][0]) - yvalueSteps = [] - result = [] - - for rowNo in range(rows): - for columnNo in range(columns): - data[rowNo][columnNo] = float(data[rowNo][columnNo]) - if yvalueMin > data[rowNo][columnNo]: - yvalueMin = data[rowNo][columnNo] - if yvalueMax < data[rowNo][columnNo]: - yvalueMax = data[rowNo][columnNo] - yvalueSteps.append(int(data[rowNo][columnNo] * 1.0) / 1.0) - result.append(tuple(data[rowNo])) - - yvalueMin = int(yvalueMin) * 1.0 - 1 - if yvalueMin < 0: - yvalueMin = 0.0 - yvalueMax = int(yvalueMax) + 2.0 - yvalueSteps.append(yvalueMin) - yvalueSteps.append(yvalueMax) - yvalueSteps = {}.fromkeys(yvalueSteps).keys() - - self._value = (yvalueMin, yvalueMax, yvalueSteps) - print result - return result - - def create(self): - dw = self._lcstyle.width - dh = self._lcstyle.height - draw = Drawing(dw, dh) - - lc = HorizontalLineChart() - line_cnts = len(self._linename) - - lg_line = (line_cnts + 3) / 4 - lc.height = dh - self._lcstyle.bottom * (lg_line + 1.5) - lc.width = dw - lc.x * 2 - lc.x = self._lcstyle.left - lc.y = self._lcstyle.bottom - - lc.data = self._data - - lc.strokeColor = self._lcstyle.strokeColor - lc.strokeWidth = self._lcstyle.strokeWidth - lc.useAbsolute = 1 - lc.groupSpacing = lc.width * 2.0 / len(self._catNames) - lc.joinedLines = 1 - lc.lineLabelFormat = self._lcstyle.format[0] - - lc.valueAxis.valueMin, lc.valueAxis.valueMax, lc.valueAxis.valueSteps = self._value - lc.valueAxis.labelTextFormat = self._lcstyle.format[1] - lc.valueAxis.labels.fontSize = self._lcstyle.labelsfont - - lc.categoryAxis.categoryNames = self._catNames - lc.categoryAxis.labels.boxAnchor = 'ne' - lc.categoryAxis.labels.dx = lc.width / 2.0 / len(self._catNames) - lc.categoryAxis.labels.dy = -6 - lc.categoryAxis.labels.angle = 10 - lc.categoryAxis.labels.fontSize = self._lcstyle.labelsfont - # lc.categoryAxis.visibleGrid = 1 - # lc.categoryAxis.tickUp = 100 - # lc.categoryAxis.tickDown = 50 - # lc.categoryAxis.gridEnd = dh - sytle_cnts = len(self._lcstyle.linestyle) - color_paris = [] - for i in range(line_cnts): - styleIndex = i % sytle_cnts - lc.lines[i].strokeColor = self._lcstyle.linestyle[styleIndex][0] - lc.lines[i].symbol = makeMarker( - self._lcstyle.linestyle[styleIndex][1]) - lc.lines[i].strokeWidth = self._lcstyle.linestyle[styleIndex][2] - color_paris.append( - (self._lcstyle.linestyle[styleIndex][0], self._linename[i])) - - lc.lineLabels.fontSize = self._lcstyle.labelsfont - 2 - - draw.add(lc) - - lg = Legend() - lg.colorNamePairs = color_paris - lg.fontName = 'Helvetica' - lg.fontSize = 7 - # lg.x = dw /2 - # lg.y = self._lcstyle.bottom *(1.5 + lg_line) - - lg.x = self._lcstyle.left * 3 - lg.y = self._lcstyle.bottom * (1 + lg_line) + lc.height - - lg.dxTextSpace = 5 - lg.dy = 5 - lg.dx = 20 - lg.deltax = 60 - lg.deltay = 0 - lg.columnMaximum = 1 - lg.alignment = 'right' - draw.add(lg) - self._draw = draw - - -class eBarChartColumn(object): - - def __init__(self, data, style): - self._bcstyle = style - if len(data) < 4: - return - self._data = self.analysisData(data) - if self._data: - self.create() - - @property - def draw(self): - return self._draw - - def analysisData(self, data): - self._ytitle = data[0] - self._name = data[1] - self._bar = data[2] - bar_data = data[3] - result = [] - for bar in bar_data: - bar = map(lambda x: float(x), bar) - result.append(tuple(bar)) - return result - - def create(self): - dw = self._bcstyle.width - dh = self._bcstyle.height - draw = Drawing(dw, dh) - - bc = VerticalBarChart() - bar_cnt = len(self._bar) - lg_line = (bar_cnt + 3) / 4 - - bc.width = dw - self._bcstyle.left - self._bcstyle.right - bc.height = dh - self._bcstyle.top - self._bcstyle.bottom - if bar_cnt > 1: - bc.height -= lg_line * 15 - - bc.x = self._bcstyle.left - bc.y = self._bcstyle.bottom - color_paris = [] - for i in range(bar_cnt): - bc.bars[i].fillColor = self._bcstyle.pillarstyle[self._bar[i]][0] - color_paris.append( - (self._bcstyle.pillarstyle[ - self._bar[i]][0], - self._bar[i])) - - bc.fillColor = self._bcstyle.background - bc.barLabels.fontName = 'Helvetica' - bc.barLabelFormat = self._bcstyle.pillarstyle[self._bar[0]][1] - bc.barLabels.fontSize = self._bcstyle.labelsfont - bc.barLabels.dy = self._bcstyle.labelsfont - bc.valueAxis.labels.fontName = 'Helvetica' - bc.valueAxis.labels.fontSize = self._bcstyle.labelsfont - bc.valueAxis.forceZero = 1 - bc.valueAxis.valueMin = 0 - - bc.data = self._data - bc.barSpacing = self._bcstyle.barSpacing - bc.groupSpacing = self._bcstyle.groupSpacing / bar_cnt - bc.valueAxis.avoidBoundFrac = 1 - bc.valueAxis.gridEnd = dw - self._bcstyle.right - bc.valueAxis.tickLeft = self._bcstyle.tick - bc.valueAxis.visibleGrid = 1 - bc.categoryAxis.categoryNames = self._name - bc.categoryAxis.tickDown = self._bcstyle.tick - bc.categoryAxis.labels.fontName = 'Helvetica' - bc.categoryAxis.labels.fontSize = self._bcstyle.labelsfont - bc.categoryAxis.labels.dy = -27 - bc.categoryAxis.labels.angle = -90 - draw.add(bc) - lb = Label() - lb.fontName = 'Helvetica' - lb.fontSize = 7 - lb.x = 12 - lb.y = 80 - lb.angle = 90 - lb.textAnchor = 'middle' - lb.maxWidth = 100 - lb.height = 20 - lb._text = self._ytitle - draw.add(lb) - if bar_cnt > 1: - lg = Legend() - lg.colorNamePairs = color_paris - lg.fontName = 'Helvetica' - lg.fontSize = 7 - - lg.x = self._bcstyle.left + bc.width / (bar_cnt + 1) - lg.y = dh - self._bcstyle.top - lg_line * 5 - - lg.dxTextSpace = 5 - lg.dy = 5 - lg.dx = 25 - lg.deltax = 80 - lg.deltay = 0 - lg.columnMaximum = 1 - lg.alignment = 'right' - draw.add(lg) - - self._draw = draw - - -class eParagraph(object): - - def __init__(self, data, style): - self._pstyle = style - self._data = self.analysisData(data) - self.create() - - def analysisData(self, data): - result = "" - for dstr in data: - if self._pstyle.name == 'ps_body': - # dstr = "" + dstr + "
" - dstr = dstr + "
" - else: - dstr = dstr + "
" - result += dstr - return result - - def create(self): - self._para = Paragraph(self._data, self._pstyle) - - @property - def para(self): - return self._para diff --git a/testsuites/vstf/vstf_scripts/vstf/controller/reporters/report/pdf/pdfcreator.py b/testsuites/vstf/vstf_scripts/vstf/controller/reporters/report/pdf/pdfcreator.py deleted file mode 100644 index 67f988c9..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/controller/reporters/report/pdf/pdfcreator.py +++ /dev/null @@ -1,131 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - - -from vstf.controller.reporters.report.pdf.pdftemplate import PdfVswitch -from vstf.controller.reporters.report.pdf.story import TitleStory, SpaceStory, ImageStory, TableStory, \ - LinePlotStory, Story, TableOfContentsStory, PageBreakStory, ParagraphStory, BarChartStory -import vstf.common.candy_text as candy -from vstf.controller.reporters.report.provider.pdf_provider import PdfProvider -from vstf.controller.settings.template_settings import TemplateSettings - -import os -import logging - -LOG = logging.getLogger(__name__) - - -class PdfCreator(object): - - def __init__(self, provider): - self._provider = provider - self._story = [] - self._pdf = None - - def create_pdf(self): - theme = self._provider.get_theme - self._pdf = PdfVswitch(theme["title"], - theme["logo"], - theme["header"], - theme["footer"], - theme["note"], - theme["style"]) - - def save_pdf(self, ofile): - self._pdf.generate(self._story, ofile) - - def add_coverpage(self): - story = Story() - story = PageBreakStory(story) - self._story += story.storylist - - def add_contents(self): - if self._provider.ifcontents: - story = Story() - story = TableOfContentsStory(story) - self._story += story.storylist - - def create_story(self): - self.add_coverpage() - self.add_contents() - self.add_context() - - def create(self, ofile): - self.create_pdf() - self.create_story() - self.save_pdf(ofile) - - def add_context(self): - context = self._provider.get_context - self._story += self._raw_context(context) - - def _raw_context(self, context, ci=0, si=0, ui=0, level=-1): - _story = [] - for key, value in sorted(context.items()): - LOG.info(key) - LOG.info(value) - _sn, _node, _style = candy.text2tuple(key) - if _node in candy.dom: - if _node == candy.chapter: - ci = _style - elif _node == candy.section: - si = _style - else: - ui = _style - _story += self._raw_context(value, ci, si, ui, level + 1) - - else: - story = Story() - LOG.info("node: %s %s" % (_node, candy.title)) - if _node == candy.title: - assert value - if level in range(len(candy.dom)): - if level == 0: - value[0] = "Chapter %s %s" % (ci, value[0]) - story = PageBreakStory(story) - elif level == 1: - value[0] = "%s.%s %s" % (ci, si, value[0]) - else: - value[0] = "%s.%s.%s %s" % (ci, si, ui, value[0]) - LOG.info(value) - story = TitleStory(story, data=value, style=_style) - elif _node == candy.table: - story = TableStory(story, data=value, style=_style) - elif _node == candy.figure: - story = ImageStory(story, data=value, style=_style) - elif _node == candy.paragraph: - story = ParagraphStory(story, data=value, style=_style) - elif _node == candy.plot: - story = LinePlotStory(story, data=value, style=_style) - elif _node == candy.chart: - story = BarChartStory(story, data=value, style=_style) - elif _node == candy.space: - assert isinstance(value, int) - for i in range(value): - story = SpaceStory(story) - _story += story.storylist - return _story - - -def main(): - from vstf.common.log import setup_logging - setup_logging( - level=logging.DEBUG, - log_file="/var/log/pdf-creator.log", - clevel=logging.INFO) - - out_file = "vstf_report.pdf" - - info = TemplateSettings() - provider = PdfProvider(info.settings) - reporter = PdfCreator(provider) - reporter.create(out_file) - -if __name__ == '__main__': - main() diff --git a/testsuites/vstf/vstf_scripts/vstf/controller/reporters/report/pdf/pdftemplate.py b/testsuites/vstf/vstf_scripts/vstf/controller/reporters/report/pdf/pdftemplate.py deleted file mode 100644 index 7e287814..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/controller/reporters/report/pdf/pdftemplate.py +++ /dev/null @@ -1,148 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -import time - -from reportlab.platypus.doctemplate import SimpleDocTemplate -from reportlab.platypus import PageBreak -from vstf.controller.reporters.report.pdf.styles import TemplateStyle, ps_head_lv1, ps_head_lv2, ps_head_lv3 -import vstf.common.constants as cst -from functools import reduce - - -class BaseDocTemplate(SimpleDocTemplate): - - def __init__(self, filename, **kw): - self.allowSplitting = 0 - SimpleDocTemplate.__init__(self, filename, **kw) - - def afterFlowable(self, flowable): - """Registers TOC entries.""" - if flowable.__class__.__name__ == 'Paragraph': - text = flowable.getPlainText() - style = flowable.style.name - if style == ps_head_lv1.name: - self.notify('TOCEntry', (0, text, self.page - 1)) - elif style == ps_head_lv2.name: - self.notify('TOCEntry', (1, text, self.page - 1)) - elif style == ps_head_lv3.name: - self.notify('TOCEntry', (2, text, self.page - 1)) - - -class PdfTemplate(object): - - def __init__(self, title, logo, header, footer, note=[], style="default"): - self._style = TemplateStyle(name=style) - self._title = title - self._logo = logo[0] - #self._header = header[0] - self._footer = footer - self._note = note - info = " Generated on %s " % time.strftime( - cst.TIME_FORMAT2, time.localtime()) - self._note += [info] - - def myFirstPage(self, canvas, doc): - raise NotImplementedError("abstract StoryDecorator") - - def myLaterPages(self, canvas, doc): - raise NotImplementedError("abstract StoryDecorator") - - def generate(self, story, output): - sizes = (self._style.page_wight, self._style.page_height) - doc = BaseDocTemplate(output, pagesize=sizes) - # doc.build(story, onFirstPage=self.myFirstPage, onLaterPages=self.myLaterPages) - doc.multiBuild( - story, - onFirstPage=self.myFirstPage, - onLaterPages=self.myLaterPages) - - -class PdfVswitch(PdfTemplate): - - def myFirstPage(self, canvas, doc): - canvas.saveState() - title_lines = len(self._title) - line_size = [self._style.title_size] * title_lines - line_size.append(0) - - canvas.drawImage( - self._logo, - (self._style.page_wight - - self._style.logo_width) / - 2.0, - self._style.page_height / - 2.0 + - ( - 1 + - self._style.title_leading) * - reduce( - lambda x, - y: x + - y, - line_size), - self._style.logo_width, - self._style.logo_height) - for i in range(title_lines): - canvas.setFont(self._style.title_font, line_size[i]) - canvas.drawCentredString( - self._style.page_wight / - 2.0, - self._style.page_height / - 2.0 + - ( - 1 + - self._style.title_leading) * - reduce( - lambda x, - y: x + - y, - line_size[ - i + - 1:]), - self._title[i]) - size = self._style.body_size - canvas.setFont(self._style.body_font, size) - note_line = len(self._note) - - for i in range(note_line): - print self._note[i] - canvas.drawCentredString(self._style.page_wight / - 2.0, self._style.page_height / - 5.0 + - (1 + - self._style.body_leading) * - size * - (note_line - - i - - 1), self._note[i]) - size = self._style.body_size - 2 - canvas.setFont(self._style.body_font, size) - canvas.drawCentredString(self._style.page_wight / - 2.0, self._style.page_bottom / - 2.0 + - (1 + - self._style.body_leading) * - size, self._footer[0]) - canvas.restoreState() - - def myLaterPages(self, canvas, doc): - canvas.saveState() - canvas.setLineWidth(self._style.line_width) - canvas.line(self._style.page_left, - self._style.page_height - self._style.page_top, - self._style.page_wight - self._style.page_right, - self._style.page_height - self._style.page_top - ) - size = self._style.body_size - 2 - canvas.setFont(self._style.body_font, size) - canvas.drawCentredString( - self._style.page_wight / 2.0, self._style.page_bottom - 24, "%s%s Page %2d " % - (self._footer[0], " " * 8, doc.page - 1)) - canvas.restoreState() diff --git a/testsuites/vstf/vstf_scripts/vstf/controller/reporters/report/pdf/story.py b/testsuites/vstf/vstf_scripts/vstf/controller/reporters/report/pdf/story.py deleted file mode 100644 index f1442fe7..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/controller/reporters/report/pdf/story.py +++ /dev/null @@ -1,216 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -__doc__ = """ -Story Decorator contains ImageStory, HeaderStory, PageBreakStory, -TableStory, LinePlotStory, TitleStory, ParagraphStory -""" -import sys -import os -from reportlab.platypus import PageBreak -from reportlab.lib import colors -from reportlab.platypus.tableofcontents import TableOfContents -from styles import * -from element import * - - -class Story(object): - - def __init__(self): - self._storylist = [] - - @property - def storylist(self): - return self._storylist - - -class StoryDecorator(Story): - - def __init__(self, story, data=None, style=None): - self._story = story - self._data = data - self._style = style - print self._data - self.new_story() - - # print self._story.storylist - @property - def storylist(self): - return self._story.storylist - - def new_story(self): - raise NotImplementedError("abstract StoryDecorator") - - -class ImageStory(StoryDecorator): - - def new_story(self): - print "Image Story" - for filename in self._data: - if os.path.exists(filename) == False: - print "not find %s" % filename - continue - if 'Traffic-types' in filename: - style = is_traffic - image_height = style.image_height - image_width = style.image_width - image_hAlign = style.image_hAlign - image_vAlign = style.image_vAlign - self._story.storylist.append( - eImage( - filename, - image_width, - image_height, - hAlign=image_hAlign, - vAlign=image_vAlign)) - else: - style = is_default - image_height = style.image_height - image_width = style.image_width - image_hAlign = style.image_hAlign - image_vAlign = style.image_vAlign - # self._story.storylist.append(eGraphicsTable([[' ' * 5, eImage(filename, image_width, image_height, hAlign=image_hAlign, vAlign=image_vAlign)]], ts_left).table) - self._story.storylist.append( - eImage( - filename, - image_width, - image_height, - hAlign=image_hAlign, - vAlign=image_vAlign)) - - -class HeaderStory(StoryDecorator): - - def new_story(self): - print "header story" - self._story.storylist.append(PageBreak()) - - -class PageBreakStory(StoryDecorator): - - def new_story(self): - print "PageBreak story" - self._story.storylist.append(PageBreak()) - - -class TableOfContentsStory(StoryDecorator): - - def new_story(self): - print "TableOfContents story" - self._data = [" ", " ", "Table Of Contents", ""] - style = ps_head_lv4 - self._story.storylist.append(eParagraph(self._data, style).para) - toc = TableOfContents() - toc.levelStyles = [ps_head_lv7, ps_head_lv8, ps_head_lv9] - self._story.storylist.append(toc) - - -class SpaceStory(StoryDecorator): - - def new_story(self): - style = ps_space - self._story.storylist.append(eParagraph([" ", " "], style).para) - - -class TableStory(StoryDecorator): - - def new_story(self): - print "table story" - style = ts_default - if self._style == 1: - self._story.storylist.append(eDataTable(self._data, style).table) - elif self._style == 2: - style = ts_left - self._story.storylist.append(eCommonTable(self._data, style).table) - elif self._style == 3: - self._story.storylist.append(eConfigTable(self._data, style).table) - elif self._style == 4: - self._story.storylist.append( - eOptionsTable(self._data, style).table) - elif self._style == 5: - self._story.storylist.append( - eProfileTable(self._data, style).table) - elif self._style == 6: - self._story.storylist.append( - eSummaryTable(self._data, style).table) - elif self._style == 7: - self._story.storylist.append( - eScenarioTable(self._data, style).table) - elif self._style == 8: - self._story.storylist.append( - eGitInfoTable(self._data, style).table) - - -class LinePlotStory(StoryDecorator): - - def new_story(self): - print "LinePlot" - style = lps_default - if not self._data: - print "data error " - return - data = eGraphicsTable([[eLinePlot(self._data, style).draw]]).table - if data: - self._story.storylist.append(data) - - -class LineChartStory(StoryDecorator): - - def new_story(self): - print "LineChartStory: " - style = lcs_default - if not self._data: - print "data error " - return - data = eGraphicsTable( - [[eHorizontalLineChart(self._data, style).draw]]).table - if data: - self._story.storylist.append(data) - - -class BarChartStory(StoryDecorator): - - def new_story(self): - print "BarChartStory: " - style = bcs_default - if not self._data: - print "data error " - return - - data = eGraphicsTable( - [[eBarChartColumn(self._data, style).draw]]).table - if data: - self._story.storylist.append(data) - - -class ParagraphStory(StoryDecorator): - - def new_story(self): - print "Paragraph Story" - style = ps_body - if not self._data: - print "data error " - return - data = eParagraph(self._data, style).para - if data: - self._story.storylist.append(data) - - -class TitleStory(StoryDecorator): - - def new_story(self): - print "Paragraph Story" - if self._style - 1 in range(9): - style = eval("ps_head_lv" + "%d" % self._style) - else: - style = ps_body - # print style - # print self._data - - self._story.storylist.append(eParagraph(self._data, style).para) diff --git a/testsuites/vstf/vstf_scripts/vstf/controller/reporters/report/pdf/styles.py b/testsuites/vstf/vstf_scripts/vstf/controller/reporters/report/pdf/styles.py deleted file mode 100644 index 2860c245..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/controller/reporters/report/pdf/styles.py +++ /dev/null @@ -1,206 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -from reportlab.lib.styles import PropertySet -from reportlab.lib.pagesizes import A4 -from reportlab.lib import colors -from reportlab.lib.styles import ParagraphStyle -import reportlab.lib.enums as ens - - -class TemplateStyle(PropertySet): - defaults = dict( - page_height=A4[1], - page_wight=A4[0], - page_left=78, - page_top=60, - page_bottom=70, - page_right=78, - title_size=16, - title_leading=1.25, - title_font='Courier-Bold', - body_size=10, - body_leading=0.8, - body_font='Courier', - line_width=1, - logo_width=131.2, - logo_height=127.7 - ) - - -class ImageStyle(PropertySet): - defaults = dict( - image_height=165, - image_width=175, - image_hAlign='CENTRE', # LEFT,CENTRE or RIGHT - image_vAlign='MIDDLE' # BOTTOM,MIDDLE or TOP - ) - - -class TableStyle(PropertySet): - defaults = dict( - table_hAlign='CENTRE', # LEFT,CENTRE or RIGHT - table_vAlign='MIDDLE', # BOTTOM,MIDDLE or TOP - table_colWidths=None, - table_rowHeights=None - ) - - -class LinePlotStyle(PropertySet): - defaults = dict( - width=430, - height=400, - left=30, - bottom=20, - strokeColor=colors.black, - strokeWidth=1, - format=('%4.2f', '%4.0f', '%3.1f'), - labelsfont=7, - linestyle=[ - (colors.red, 'Circle', 1.5), - (colors.blue, 'Diamond', 1.5), - (colors.gold, 'Square', 1.5), - (colors.green, 'Triangle', 1.5), - (colors.pink, 'FilledCircle', 1.5), - (colors.lightblue, 'FilledDiamond', 1.5), - (colors.lightgreen, 'FilledTriangle', 1.5) - ] - ) - - -class LineChartStyle(PropertySet): - defaults = dict( - width=430, - height=400, - left=30, - bottom=20, - strokeColor=colors.lightgrey, - strokeWidth=1, - format=('%4.2f', '%3.1f'), - labelsfont=8, - linestyle=[ - (colors.red, 'Circle', 1.5), - (colors.blue, 'Diamond', 1.5), - (colors.gold, 'Square', 1.5), - (colors.green, 'Triangle', 1.5), - (colors.pink, 'FilledCircle', 1.5), - (colors.lightblue, 'FilledDiamond', 1.5), - (colors.lightgreen, 'FilledTriangle', 1.5) - ] - ) - - -class BarChartStyle(PropertySet): - defaults = dict( - width=430, - height=135, - left=30, - bottom=50, - top=0, - right=30, - groupSpacing=32, - barSpacing=4, - tick=3, - strokeColor=colors.lightgrey, - strokeWidth=1, - pillarstyle={ - "loss": (colors.lightgreen, '%4.2f'), - "latency": (colors.indianred, '%4.1f'), - "fastlink": (colors.pink, '%4.1f'), - "l2switch": (colors.lightblue, '%4.1f'), - "kernel rdp": (colors.lightgreen, '%4.1f'), - "ovs": (colors.purple, '%4.1f') - }, - background=colors.lightgrey, - labelsfont=6, - ) - - -tes_default = TemplateStyle(name='default') -is_default = ImageStyle(name='default') -is_traffic = ImageStyle(name='traffic', - image_height=150, - image_width=360, - image_hAlign='CENTRE') - -ts_default = TableStyle(name='default') -ts_left = TableStyle( - name='left', - table_hAlign='LEFT', # LEFT,CENTRE or RIGHT - table_vAlign='BOTTOM', # BOTTOM,MIDDLE or TOP - table_colWidths=None, - table_rowHeights=None -) -lps_default = LinePlotStyle(name='default') -lcs_default = LineChartStyle(name='default') -bcs_default = BarChartStyle(name='default') -ps_head_lv1 = ParagraphStyle(name='ps_head_lv1', - fontName='Courier-Bold', - alignment=ens.TA_CENTER, # TA_LEFT, TA_RIGHT - fontSize=13, - leading=22, - leftIndent=0) - -ps_head_lv2 = ParagraphStyle(name='ps_head_lv2', - fontName='Courier', - fontSize=12, - leading=20, - leftIndent=16) - -ps_head_lv3 = ParagraphStyle(name='ps_head_lv3', - fontSize=11, - fontName='Courier', - leading=20, - leftIndent=16) - -ps_head_lv4 = ParagraphStyle(name='ps_head_lv4', - fontSize=13, - fontName='Courier-Bold', - leading=22, - leftIndent=0) - -ps_head_lv5 = ParagraphStyle(name='ps_head_lv5', - fontSize=12, - fontName='Courier', - leading=20, - leftIndent=16) - -ps_head_lv6 = ParagraphStyle(name='ps_head_lv6', - fontSize=11, - fontName='Courier', - leading=20, - leftIndent=16) - -ps_head_lv7 = ParagraphStyle(name='ps_head_lv7', - fontSize=11, - fontName='Courier', - leading=18, - leftIndent=0) - -ps_head_lv8 = ParagraphStyle(name='ps_head_lv8', - fontSize=11, - fontName='Courier', - leading=18, - leftIndent=16) - -ps_head_lv9 = ParagraphStyle(name='ps_head_lv9', - fontSize=11, - fontName='Courier', - leading=18, - leftIndent=32) - -ps_body = ParagraphStyle(name='ps_body', - fontSize=11, - fontName='Courier', - leading=18, - leftIndent=32) - -ps_space = ParagraphStyle(name='ps_space', - fontSize=5, - leading=5) diff --git a/testsuites/vstf/vstf_scripts/vstf/controller/reporters/report/provider/__init__.py b/testsuites/vstf/vstf_scripts/vstf/controller/reporters/report/provider/__init__.py deleted file mode 100644 index 83b8d15d..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/controller/reporters/report/provider/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## diff --git a/testsuites/vstf/vstf_scripts/vstf/controller/reporters/report/provider/html_provider.py b/testsuites/vstf/vstf_scripts/vstf/controller/reporters/report/provider/html_provider.py deleted file mode 100644 index 2e0863ec..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/controller/reporters/report/provider/html_provider.py +++ /dev/null @@ -1,49 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -import logging - -LOG = logging.getLogger(__name__) -from vstf.controller.settings.html_settings import HtmlSettings -from vstf.controller.settings.template_settings import TemplateSettings - - -class HtmlProvider(object): - - def __init__(self, info, style): - self._info = info - self._style = style - - @property - def get_style(self): - assert "style" in self._style - return self._style["style"] - - @property - def get_context(self): - assert "context" in self._info - return self._info["context"] - - -def main(): - from vstf.common.log import setup_logging - setup_logging( - level=logging.DEBUG, - log_file="/var/log/html-provder.log", - clevel=logging.INFO) - - html_settings = HtmlSettings() - LOG.info(html_settings.settings) - info = TemplateSettings() - provider = HtmlProvider(info.settings, html_settings.settings) - LOG.info(provider.get_style) - LOG.info(provider.get_context) - -if __name__ == '__main__': - main() diff --git a/testsuites/vstf/vstf_scripts/vstf/controller/reporters/report/provider/pdf_provider.py b/testsuites/vstf/vstf_scripts/vstf/controller/reporters/report/provider/pdf_provider.py deleted file mode 100644 index f7752016..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/controller/reporters/report/provider/pdf_provider.py +++ /dev/null @@ -1,53 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - - -import logging - -LOG = logging.getLogger(__name__) -from vstf.controller.settings.template_settings import TemplateSettings - - -class PdfProvider(object): - - def __init__(self, info): - self._info = info - - @property - def get_theme(self): - assert "theme" in self._info - return self._info["theme"] - - @property - def ifcontents(self): - assert "contents" in self._info - assert "enable" in self._info["contents"] - return self._info["contents"]["enable"] - - @property - def get_context(self): - assert "context" in self._info - return self._info["context"] - - -def main(): - from vstf.common.log import setup_logging - setup_logging( - level=logging.DEBUG, - log_file="/var/log/pdf-provider.log", - clevel=logging.INFO) - - info = TemplateSettings() - provider = PdfProvider(info.settings) - LOG.info(provider.get_theme) - LOG.info(provider.ifcontents) - LOG.info(provider.get_context) - -if __name__ == '__main__': - main() diff --git a/testsuites/vstf/vstf_scripts/vstf/controller/reporters/reporter.py b/testsuites/vstf/vstf_scripts/vstf/controller/reporters/reporter.py deleted file mode 100644 index ea0a1ad0..00000000 --- a/testsuites/vstf/vstf_scripts/vstf/controller/reporters/reporter.py +++ /dev/null @@ -1,130 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -import os -import argparse -import logging -import time - -from vstf.controller.reporters.report.provider.html_provider import HtmlProvider -from vstf.controller.reporters.report.provider.pdf_provider import PdfProvider -from vstf.controller.settings.template_settings import TemplateSettings -from vstf.controller.reporters.report.data_factory import TaskData -from vstf.controller.reporters.report.html.htmlcreator import HtmlCreator -from vstf.controller.reporters.report.pdf.pdfcreator import PdfCreator -from vstf.controller.database.dbinterface import DbManage -from vstf.controller.settings.mail_settings import MailSettings -from vstf.controller.reporters.mail.sendmail import SendMail -from vstf.controller.settings.html_settings import HtmlSettings -from vstf.controller.reporters.report.candy_generator import CandyGenerator -import vstf.common.constants as cst - - -LOG = logging.getLogger(__name__) - - -class Report(object): - - def __init__(self, dbase, rpath): - """ - - :type dbase: object DbManage - """ - self._dbase = dbase - self._rpath = "." - self._mail_settings = MailSettings() - if os.path.exists(rpath): - self._rpath = rpath - - def create_pdf(self, taskid): - task = TaskData(taskid, self._dbase) - scenario_list = task.common.get_scenariolist() - creator = CandyGenerator(task) - attach_list = [] - for scenario in scenario_list: - out_file = os.path.join( - self._rpath, "vstf_report_%s_%s.pdf" % - (scenario, time.strftime( - cst.TIME_FORMAT3))) - LOG.info(out_file) - creator.create(scenario) - info = TemplateSettings() - provider = PdfProvider(info.settings) - reporter = PdfCreator(provider) - reporter.create(out_file) - attach_list.append(out_file) - - if attach_list: - self._mail_settings.mset_attach(attach_list) - - def create_html(self, taskid): - task = TaskData(taskid, self._dbase) - - creator = CandyGenerator(task) - creator.create_all() - - html_settings = HtmlSettings() - info = TemplateSettings() - LOG.info(html_settings.settings) - - provider = HtmlProvider(info.settings, html_settings.settings) - out_file = os.path.join(self._rpath, "mail.html") - LOG.info(out_file) - - html = HtmlCreator(provider) - content = html.create(out_file) - - self._mail_settings.mset_subtype('html') - self._mail_settings.mset_content(content) - - def report(self, taskid, mail_off): - self._mail_settings = MailSettings() - mail = SendMail(self._mail_settings.settings) - self.create_pdf(taskid) - self.create_html(taskid) - if not mail_off: - mail.send() - - -def main(): - from vstf.common.log import setup_logging - setup_logging( - level=logging.DEBUG, - log_file="/var/log/vstf/vstf-reporter.log", - clevel=logging.INFO) - - parser = argparse.ArgumentParser(add_help=True) - parser.add_argument('-rpath', - action='store', - default='./', - type=str, - help=" the path name of test results " - ) - parser.add_argument('-mail_off', - action='store_true', - help="is need send mail the for the report" - ) - parser.add_argument('--taskid', - action='store', - default=-1, - help="report depand of a history task id." - ) - args = parser.parse_args() - dbase = DbManage() - - report = Report(dbase, args.rpath) - if args.taskid == -1: - taskid = dbase.get_last_taskid() - else: - taskid = args.taskid - report.report(taskid, args.mail_off) - - -if __name__ == '__main__': - main() diff --git a/testsuites/vstf/vstf_scripts/vstf/controller/res/Traffic-types.gif b/testsuites/vstf/vstf_scripts/vstf/controller/res/Traffic-types.gif deleted file mode 100644 index 4b1fc600b87b41b473eb778696e189c875390f23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 160486 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

tBr@qxJQvI4Vw%P+Ow2^aa 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