vmtp/perf_instance.py
Yichen Wang 09baadba2c Initial release of VMTP to stackforge
Change-Id: I30eb092d9a70dc6b3642a84887bb4604b1a3ea54
2015-02-09 14:14:00 -08:00

106 lines
3.8 KiB
Python

# Copyright 2014 Cisco Systems, Inc. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
#
from instance import Instance as Instance
from perf_tool import PingTool
class PerfInstance(Instance):
'''An openstack instance to run performance tools
'''
def __init__(self, name, config, comp=None, net=None, server=False):
Instance.__init__(self, name, config, comp, net)
self.is_server = server
if 'I' in config.protocols:
self.ping = PingTool(self)
else:
self.ping = None
if config.tp_tool:
self.tp_tool = config.tp_tool(self, config.perf_tool_path)
else:
self.tp_tool = None
# No args is reserved for native host server
def create(self, image=None, flavor_type=None,
keypair=None, nics=None, az=None,
management_network_name=None,
sec_group=None,
init_file_name=None):
'''Create an instance
:return: True on success, False on error
'''
rc = Instance.create(self, image, flavor_type, keypair,
nics, az,
management_network_name,
sec_group,
init_file_name)
if not rc:
return False
if self.tp_tool and not self.tp_tool.install():
return False
if not self.is_server:
return True
if self.tp_tool and not self.tp_tool.start_server():
return False
return True
def run_client(self, label, dest_ip, target_instance, mss=None,
bandwidth=0,
bidirectional=False,
az_to=None):
'''test iperf client using the default TCP window size
(tcp window scaling is normally enabled by default so setting explicit window
size is not going to help achieve better results)
:return: a dictionary containing the results of the run
'''
# Latency (ping rtt)
if 'I' in self.config.protocols:
ping_res = self.ping.run_client(dest_ip)
else:
ping_res = None
# TCP/UDP throughput with tp_tool, returns a list of dict
if self.tp_tool and 'error' not in ping_res:
tp_tool_res = self.tp_tool.run_client(dest_ip,
target_instance,
mss=mss,
bandwidth=bandwidth,
bidirectional=bidirectional)
else:
tp_tool_res = []
res = {'ip_to': dest_ip}
if self.internal_ip:
res['ip_from'] = self.internal_ip
if label:
res['desc'] = label
if self.az:
res['az_from'] = self.az
if az_to:
res['az_to'] = az_to
res['distro_id'] = self.ssh.distro_id
res['distro_version'] = self.ssh.distro_version
# consolidate results for all tools
if ping_res:
tp_tool_res.append(ping_res)
res['results'] = tp_tool_res
return res
# Override in order to terminate the perf server
def dispose(self):
if self.tp_tool:
self.tp_tool.dispose()
Instance.dispose(self)