fix pre-demo bugs
diff --git a/config.yaml b/config.yaml
index 5e226e0..8bb1fa2 100644
--- a/config.yaml
+++ b/config.yaml
@@ -52,21 +52,22 @@
# # tests to run
tests: # $include(tests.yaml)
- start_test_nodes:
- openstack:
- vm_params:
- count: x1
- img_name: disk_io_perf
- flavor_name: disk_io_perf.256
- keypair_name: disk_io_perf
- network_zone_name: novanetwork
- flt_ip_pool: nova
- creds: "ssh://ubuntu@{0}::disk_io_perf.pem"
- tests:
- - pgbench:
- opts:
- num_clients: [4, 8, 12]
- transactions: [1, 2, 3]
+ start_test_nodes:
+ openstack:
+
+ vm_params:
+ count: x1
+ img_name: disk_io_perf
+ flavor_name: disk_io_perf.256
+ keypair_name: disk_io_perf
+ network_zone_name: novanetwork
+ flt_ip_pool: nova
+ creds: "ssh://ubuntu@{0}::disk_io_perf.pem"
+ internal_tests:
+ - pgbench:
+ opts:
+ num_clients: [4, 8, 12]
+ transactions: [1, 2, 3]
# - io: tests/io_task_test.cfg
diff --git a/koder.yaml b/koder.yaml
index 5a719cd..28a8829 100644
--- a/koder.yaml
+++ b/koder.yaml
@@ -1,10 +1,16 @@
clouds:
- fuel:
- id: 3
- url: http://172.16.52.112:8000/
- creds: admin:admin@admin
- ssh_creds: root:test37
- openstack_env: test
+ fuel:
+ id: 3
+ url: http://172.16.52.112:8000/
+ creds: admin:admin@admin
+ ssh_creds: root:test37
+ openstack_env: test
+
+ openstack:
+ OS_TENANT_NAME: admin
+ OS_USERNAME: admin
+ OS_PASSWORD: admin
+ OS_AUTH_URL: http://172.16.53.3:5000/v2.0/
discover: fuel
@@ -20,6 +26,7 @@
tests:
start_test_nodes:
openstack:
+ creds: clouds
vm_params:
count: x1
img_name: disk_io_perf
diff --git a/run_test.py b/run_test.py
index 1d58ede..aa47b21 100755
--- a/run_test.py
+++ b/run_test.py
@@ -6,6 +6,7 @@
import pprint
import logging
import argparse
+import traceback
import threading
import collections
@@ -50,6 +51,14 @@
return templ.format(data, formatter(res), "=" * 80)
+class Context(object):
+ def __init__(self):
+ self.build_meta = {}
+ self.nodes = []
+ self.clear_calls_stack = []
+ self.openstack_nodes_ids = []
+
+
def connect_one(node):
try:
ssh_pref = "ssh://"
@@ -216,52 +225,89 @@
ctx.sensor_data = ctx.sensors_control_queue.get()
-def run_all_test(cfg, ctx, store_nodes):
+def run_all_test(cfg, ctx):
ctx.results = []
if 'start_test_nodes' in cfg['tests']:
params = cfg['tests']['start_test_nodes']['openstack']
+ os_nodes_ids = []
- for new_node in start_vms.launch_vms(params):
- new_node.roles.append('testnode')
- ctx.nodes.append(new_node)
+ os_creds = params['creds']
+
+ if os_creds == 'fuel':
+ raise NotImplementedError()
+
+ elif os_creds == 'clouds':
+ os_cfg = cfg['clouds']['openstack']
+ tenant = os_cfg['OS_TENANT_NAME'].strip()
+ user = os_cfg['OS_USERNAME'].strip()
+ passwd = os_cfg['OS_PASSWORD'].strip()
+ auth_url = os_cfg['OS_AUTH_URL'].strip()
+
+ elif os_creds == 'ENV':
+ tenant = None
+ user = None
+ passwd = None
+ auth_url = None
+
+ else:
+ raise ValueError("Only 'ENV' creds are supported")
+
+ start_vms.nova_connect(user, passwd, tenant, auth_url)
+
+ new_nodes = []
+ for new_node, node_id in start_vms.launch_vms(params):
+ new_node.roles.append('testnode')
+ ctx.nodes.append(new_node)
+ os_nodes_ids.append(node_id)
+ new_nodes.append(new_node)
+
+ store_nodes_in_log(os_nodes_ids)
+ ctx.openstack_nodes_ids = os_nodes_ids
+
+ connect_all(new_nodes)
if 'tests' in cfg:
- store_nodes(ctx.nodes)
ctx.results.extend(run_tests(cfg_dict, ctx.nodes))
-def shut_down_vms(cfg, ctx):
- with open('vm_journal.log') as f:
- data = str(f.read())
- nodes = pickle.loads(data)
+def shut_down_vms_stage(cfg, ctx):
+ if ctx.openstack_nodes_ids is None:
+ data = open('vm_journal.log').read().strip()
- for node in nodes:
- logger.info("Node " + str(node) + " has been loaded")
+ if data == "":
+ logger.info("Journal file is empty")
+ return
- logger.info("Removing nodes")
- start_vms.clear_nodes()
- logger.info("Nodes has been removed")
+ try:
+ nodes_ids = pickle.loads(data)
+ except:
+ logger.error("File vm_journal.log corrupted")
+ return
+ else:
+ nodes_ids = ctx.openstack_nodes_ids
+
+ logger.info("Removing nodes")
+ start_vms.clear_nodes(nodes_ids)
+ logger.info("Nodes has been removed")
-def store_nodes(nodes):
+def store_nodes_in_log(nodes_ids):
with open('vm_journal.log', 'w+') as f:
- f.write(pickle.dumps([nodes]))
- for node in nodes:
- logger.info("Node " + str(node) + " has been stored")
+ f.write(pickle.dumps([nodes_ids]))
def clear_enviroment(cfg, ctx):
if os.path.exists('vm_journal.log'):
- shut_down_vms(cfg, ctx)
+ shut_down_vms_stage(cfg, ctx)
os.remove('vm_journal.log')
def run_tests_stage(cfg, ctx):
# clear nodes that possible were created on previous test running
- clear_enviroment(cfg, ctx)
- ctx.clear_calls_stack.append(shut_down_vms)
- run_all_test(cfg, ctx, store_nodes)
+ # clear_enviroment(cfg, ctx) << fix OS connection
+ ctx.clear_calls_stack.append(shut_down_vms_stage)
+ run_all_test(cfg, ctx)
def disconnect_stage(cfg, ctx):
@@ -272,6 +318,7 @@
def report_stage(cfg, ctx):
output_dest = cfg.get('output_dest')
+
if output_dest is not None:
if output_dest.endswith(".html"):
report.render_html_results(ctx, output_dest)
@@ -293,13 +340,6 @@
logger.debug(str(node))
-class Context(object):
- def __init__(self):
- self.build_meta = {}
- self.nodes = []
- self.clear_calls_stack = []
-
-
def load_config(path):
global cfg_dict
cfg_dict = parse_config(path)
@@ -319,7 +359,7 @@
# complete_log_nodes_statistic,
deploy_sensors_stage,
run_tests_stage,
- # report_stage
+ report_stage
]
load_config(opts.config_file)
@@ -341,8 +381,8 @@
try:
logger.info("Start {0.__name__} stage".format(stage))
stage(cfg_dict, ctx)
- except:
- pass
+ except Exception as exc:
+ logger.exception("During {0.__name__} stage".format(stage))
if exc is not None:
raise exc, cls, tb
diff --git a/start_vms.py b/start_vms.py
index 7317fd0..821c299 100644
--- a/start_vms.py
+++ b/start_vms.py
@@ -9,8 +9,7 @@
from cinderclient.v1.client import Client as c_client
from nodes.node import Node
-from nodes.openstack import get_floating_ip
-from utils import parse_creds
+
logger = logging.getLogger("io-perf-tool")
@@ -25,9 +24,23 @@
return name, passwd, tenant, auth_url
-def nova_connect():
- return n_client('1.1', *ostack_get_creds()
- )
+NOVA_CONNECTION = None
+
+
+def nova_connect(name=None, passwd=None, tenant=None, auth_url=None):
+ global NOVA_CONNECTION
+ if NOVA_CONNECTION is None:
+ if name is None:
+ name, passwd, tenant, auth_url = ostack_get_creds()
+ NOVA_CONNECTION = n_client('1.1', name, passwd, tenant, auth_url)
+ return NOVA_CONNECTION
+
+
+def nova_disconnect():
+ global NOVA_CONNECTION
+ if NOVA_CONNECTION is not None:
+ NOVA_CONNECTION.close()
+ NOVA_CONNECTION = None
def create_keypair(nova, name, key_path):
@@ -87,26 +100,21 @@
def launch_vms(config):
- creds = config['vm_params']['creds']
-
- # if creds != 'ENV':
- # raise ValueError("Only 'ENV' creds are supported")
-
logger.debug("Starting new nodes on openstack")
- conn = nova_connect()
params = config['vm_params'].copy()
count = params.pop('count')
if isinstance(count, basestring):
assert count.startswith("x")
- lst = conn.services.list(binary='nova-compute')
+ lst = NOVA_CONNECTION.services.list(binary='nova-compute')
srv_count = len([srv for srv in lst if srv.status == 'enabled'])
count = srv_count * int(count[1:])
- creds = params.pop('creds')
+ # vm_creds = config['vm_params']['creds'] ?????
+ vm_creds = params.pop('creds')
- for ip, _ in create_vms_mt(conn, count, **params):
- yield Node(creds.format(ip), [])
+ for ip, os_node in create_vms_mt(NOVA_CONNECTION, count, **params):
+ yield Node(vm_creds.format(ip), []), os_node.id
def create_vms_mt(nova, amount, keypair_name, img_name,
@@ -201,15 +209,21 @@
return flt_ip.ip, nova.servers.get(srv.id)
-def clear_nodes():
- nova = nova_connect()
- clear_all(nova)
+def clear_nodes(nodes_ids):
+ clear_all(NOVA_CONNECTION, nodes_ids, None)
-def clear_all(nova, name_templ="ceph-test-{0}"):
+def clear_all(nova, ids=None, name_templ="ceph-test-{0}"):
+
+ def need_delete(srv):
+ if name_templ is not None:
+ return re.match(name_templ.format("\\d+"), srv.name) is not None
+ else:
+ return srv.id in ids
+
deleted_srvs = set()
for srv in nova.servers.list():
- if re.match(name_templ.format("\\d+"), srv.name):
+ if need_delete(srv):
logger.debug("Deleting server {0}".format(srv.name))
nova.servers.delete(srv)
deleted_srvs.add(srv.id)
@@ -224,13 +238,14 @@
# wait till vm actually deleted
- cinder = c_client(*ostack_get_creds())
- for vol in cinder.volumes.list():
- if isinstance(vol.display_name, basestring):
- if re.match(name_templ.format("\\d+"), vol.display_name):
- if vol.status in ('available', 'error'):
- logger.debug("Deleting volume " + vol.display_name)
- cinder.volumes.delete(vol)
+ if name_templ is not None:
+ cinder = c_client(*ostack_get_creds())
+ for vol in cinder.volumes.list():
+ if isinstance(vol.display_name, basestring):
+ if re.match(name_templ.format("\\d+"), vol.display_name):
+ if vol.status in ('available', 'error'):
+ logger.debug("Deleting volume " + vol.display_name)
+ cinder.volumes.delete(vol)
logger.debug("Clearing done (yet some volumes may still deleting)")
diff --git a/tests/io_task_test.cfg b/tests/io_task_test.cfg
index c9fc2ab..4d78578 100644
--- a/tests/io_task_test.cfg
+++ b/tests/io_task_test.cfg
@@ -1,4 +1,5 @@
[writetest * 3]
+group_reporting
numjobs=4
wait_for_previous
ramp_time=5
diff --git a/tests/itest.py b/tests/itest.py
index b073879..53c4af3 100644
--- a/tests/itest.py
+++ b/tests/itest.py
@@ -5,6 +5,7 @@
import logging
from disk_perf_test_tool.tests import disk_test_agent
+from disk_perf_test_tool.tests.io_results_loader import parse_output
from disk_perf_test_tool.ssh_utils import copy_paths
from disk_perf_test_tool.utils import run_over_ssh, ssize_to_b
@@ -141,7 +142,7 @@
def on_result(self, code, out_err, cmd):
if 0 == code:
try:
- for data in disk_test_agent.parse_output(out_err):
+ for data in parse_output(out_err):
self.on_result_cb(data)
except Exception as exc:
msg_templ = "Error during postprocessing results: {0!r}"