rally/rally/plugins/common/exporter/file_system.py

106 lines
3.8 KiB
Python

# Copyright 2016: Mirantis 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.
import json
import os
from six.moves.urllib import parse as urlparse
from rally import api
from rally.common import logging
from rally import exceptions
from rally.task import exporter
LOG = logging.getLogger(__name__)
@exporter.configure(name="file")
class FileExporter(exporter.Exporter):
def validate(self):
"""Validate connection string.
The format of connection string in file plugin is
file:///<path>.<type-of-output>
"""
parse_obj = urlparse.urlparse(self.connection_string)
available_formats = ("json",)
available_formats_str = ", ".join(available_formats)
if self.connection_string is None or parse_obj.path == "":
raise exceptions.InvalidConnectionString(
"It should be `file:///<path>.<type-of-output>`.")
if self.type not in available_formats:
raise exceptions.InvalidConnectionString(
"Type of the exported task is not available. The available "
"formats are %s." %
available_formats_str)
def __init__(self, connection_string):
super(FileExporter, self).__init__(connection_string)
self.path = os.path.expanduser(urlparse.urlparse(
connection_string).path[1:])
self.type = connection_string.split(".")[-1]
self.validate()
def export(self, uuid):
"""Export results of the task to the file.
:param uuid: uuid of the task object
"""
task = api._Task.get_detailed(uuid)
LOG.debug("Got the task object by it's uuid %s. " % uuid)
task_results = [{"key": x["key"], "result": x["data"]["raw"],
"sla": x["data"]["sla"],
"hooks": x["data"].get("hooks"),
"load_duration": x["data"]["load_duration"],
"full_duration": x["data"]["full_duration"]}
for x in task["results"]]
if self.type == "json":
if task_results:
res = json.dumps(task_results, sort_keys=False, indent=4,
separators=(",", ": "))
LOG.debug("Got the task %s results." % uuid)
else:
msg = ("Task %s results would be available when it will "
"finish." % uuid)
raise exceptions.RallyException(msg)
if os.path.dirname(self.path) and (not os.path.exists(os.path.dirname(
self.path))):
raise IOError("There is no such directory: %s" %
os.path.dirname(self.path))
with open(self.path, "w") as f:
LOG.debug("Writing task %s results to the %s." % (
uuid, self.connection_string))
f.write(res)
LOG.debug("Task %s results was written to the %s." % (
uuid, self.connection_string))
@exporter.configure(name="file-exporter")
class DeprecatedFileExporter(FileExporter):
"""DEPRECATED."""
def __init__(self, connection_string):
super(DeprecatedFileExporter, self).__init__(connection_string)
LOG.warning("'file-exporter' plugin is deprecated. Use 'file' "
"instead.")