summaryrefslogtreecommitdiffstats
path: root/qtip/loader
diff options
context:
space:
mode:
Diffstat (limited to 'qtip/loader')
-rw-r--r--qtip/loader/file.py10
-rw-r--r--qtip/loader/plan.py35
-rw-r--r--qtip/loader/yaml_file.py19
3 files changed, 43 insertions, 21 deletions
diff --git a/qtip/loader/file.py b/qtip/loader/file.py
index 00f94818..0ea4d5b6 100644
--- a/qtip/loader/file.py
+++ b/qtip/loader/file.py
@@ -25,12 +25,12 @@ class FileLoader(BaseLoader):
_paths = [ROOT_DIR]
def __init__(self, name, paths=None):
- self._file = name
- self._abspath = self._find(name, paths=paths)
+ self._filename = name
+ self.abspath = self.find(name, paths=paths)
- def _find(self, name, paths=None):
+ def find(self, name, paths=None):
"""find a specification in searching paths"""
- paths = self._paths if paths is None else paths
+ paths = [self.abspath] if paths is None else paths
for p in paths:
abspath = path.join(p, self.RELATIVE_PATH, name)
if path.exists(abspath):
@@ -47,4 +47,4 @@ class FileLoader(BaseLoader):
item = cls(name, paths=paths)
yield {
BaseProp.NAME: name,
- BaseProp.ABSPATH: item._abspath}
+ BaseProp.ABSPATH: item.abspath}
diff --git a/qtip/loader/plan.py b/qtip/loader/plan.py
index 6f1764e2..e15651a3 100644
--- a/qtip/loader/plan.py
+++ b/qtip/loader/plan.py
@@ -8,12 +8,21 @@
##############################################################################
-from qtip.base.constant import PlanProp
+from qtip.base.constant import BaseProp
+from qtip.collector import CollectorProp as CProp
from qtip.collector.logfile import LogfileCollector
from qtip.loader.yaml_file import YamlFileLoader
from qtip.loader.qpi import QPISpec
+# TODO(yujunz) more elegant way to load module dynamically
+def load_collector(type_name):
+ if type_name == LogfileCollector.TYPE:
+ return LogfileCollector
+ else:
+ raise Exception("Invalid collector type: {}".format(type_name))
+
+
class Plan(YamlFileLoader):
"""
a benchmark plan is consist of configuration and a QPI list
@@ -24,10 +33,26 @@ class Plan(YamlFileLoader):
def __init__(self, name, paths=None):
super(Plan, self).__init__(name, paths)
+ _config = self.content[PlanProp.CONFIG]
+
+ self.collectors = [load_collector(c[CProp.TYPE])(c, self)
+ for c in _config[PlanProp.COLLECTORS]]
+
self.qpis = [QPISpec(qpi, paths=paths)
for qpi in self.content[PlanProp.QPIS]]
- self.info = self.content[PlanProp.INFO]
- _config = self.content[PlanProp.CONFIG]
- # TODO(yujunz) create collector by name
- self.collector = LogfileCollector(_config[PlanProp.COLLECTOR], paths)
+
+class PlanProp(BaseProp):
+ # plan
+ INFO = 'info'
+
+ FACILITY = 'facility'
+ ENGINEER = 'engineer'
+
+ CONFIG = 'config'
+
+ DRIVER = 'driver'
+ COLLECTORS = 'collectors'
+ REPORTER = 'reporter'
+
+ QPIS = 'QPIs'
diff --git a/qtip/loader/yaml_file.py b/qtip/loader/yaml_file.py
index f1cd4614..8b78a47c 100644
--- a/qtip/loader/yaml_file.py
+++ b/qtip/loader/yaml_file.py
@@ -7,11 +7,10 @@
# http://www.apache.org/licenses/LICENSE-2.0
##############################################################################
-from collections import defaultdict
from os import path
import yaml
-from qtip.base.error import InvalidFormat
+from qtip.base.error import InvalidContent
from qtip.base.constant import BaseProp
from qtip.loader.file import FileLoader
@@ -21,13 +20,11 @@ class YamlFileLoader(FileLoader):
def __init__(self, name, paths=None):
super(YamlFileLoader, self).__init__(name, paths)
- content = defaultdict(lambda: None)
+ abspath = self.abspath
- try:
- content.update(yaml.safe_load(file(self._abspath)))
- except yaml.YAMLError:
- # TODO(yujunz) log yaml error
- raise InvalidFormat(self._abspath)
-
- self.name = content[BaseProp.NAME] or path.splitext(name)[0]
- self.content = content
+ with open(abspath, 'r') as stream:
+ content = yaml.safe_load(stream)
+ if not isinstance(content, dict):
+ raise InvalidContent(abspath)
+ self.content = content
+ self.name = content.get(BaseProp.NAME, path.splitext(name)[0])