diff options
author | liang gao <jean.gaoliang@huawei.com> | 2016-07-06 08:14:21 +0000 |
---|---|---|
committer | Gerrit Code Review <gerrit@172.30.200.206> | 2016-07-06 08:14:21 +0000 |
commit | eacef205efa9289bccbf38d82df07cdc63486d35 (patch) | |
tree | e7b75d8a40916dd8133a65562e37a0148492e64e /yardstick | |
parent | 51b902b9d9d7a641357dd615dcd5a5529bffc8bb (diff) | |
parent | 16ce4952ca7eaa0eff042ac72c9461f56f74f14b (diff) |
Merge "Creating a generic opertion"
Diffstat (limited to 'yardstick')
4 files changed, 174 insertions, 0 deletions
diff --git a/yardstick/benchmark/scenarios/availability/operation/__init__.py b/yardstick/benchmark/scenarios/availability/operation/__init__.py new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/yardstick/benchmark/scenarios/availability/operation/__init__.py diff --git a/yardstick/benchmark/scenarios/availability/operation/baseoperation.py b/yardstick/benchmark/scenarios/availability/operation/baseoperation.py new file mode 100644 index 000000000..e776e87ae --- /dev/null +++ b/yardstick/benchmark/scenarios/availability/operation/baseoperation.py @@ -0,0 +1,81 @@ +############################################################################## +# Copyright (c) 2016 Juan Qiu and others +# juan_ qiu@tongji.edu.cn +# 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 pkg_resources +import yaml +import logging +import os + +import yardstick.common.utils as utils + +LOG = logging.getLogger(__name__) + +operation_conf_path = pkg_resources.resource_filename( + "yardstick.benchmark.scenarios.availability", + "operation_conf.yaml") + + +class OperationMgr(object): + + def __init__(self): + self._operation_list = [] + + def init_operations(self, operation_cfgs, context): + LOG.debug("operationMgr confg: %s" % operation_cfgs) + for cfg in operation_cfgs: + operation_type = cfg['operation_type'] + operation_cls = BaseOperation.get_operation_cls(operation_type) + operation_ins = operation_cls(cfg, context) + operation_ins.key = cfg['key'] + operation_ins.setup() + self._operation_list.append(operation_ins) + + def __getitem__(self, item): + for obj in self._operation_list: + if(obj.key == item): + return obj + raise KeyError("No such operation instance of key - %s" % item) + + def rollback(self): + for _instance in self._operation_list: + _instance.rollback() + + +class BaseOperation(object): + + operation_cfgs = {} + + def __init__(self, config, context): + if not BaseOperation.operation_cfgs: + with open(operation_conf_path) as stream: + BaseOperation.operation_cfgs = yaml.load(stream) + self.key = '' + self._config = config + self._context = context + + @staticmethod + def get_operation_cls(type): + '''return operation instance of specified type''' + operation_type = type + for operation_cls in utils.itersubclasses(BaseOperation): + if operation_type == operation_cls.__operation__type__: + return operation_cls + raise RuntimeError("No such runner_type %s" % operation_type) + + def get_script_fullpath(self, path): + base_path = os.path.dirname(operation_conf_path) + return os.path.join(base_path, path) + + def setup(self): + pass + + def run(self): + pass + + def rollback(self): + pass diff --git a/yardstick/benchmark/scenarios/availability/operation/operation_general.py b/yardstick/benchmark/scenarios/availability/operation/operation_general.py new file mode 100644 index 000000000..d41371629 --- /dev/null +++ b/yardstick/benchmark/scenarios/availability/operation/operation_general.py @@ -0,0 +1,77 @@ +############################################################################## +# Copyright (c) 2016 Juan Qiu and others +# juan_ qiu@tongji.edu.cn +# 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 baseoperation import BaseOperation +import yardstick.ssh as ssh +from yardstick.benchmark.scenarios.availability.util import buildshellparams + +LOG = logging.getLogger(__name__) + + +class GeneralOperaion(BaseOperation): + + __operation__type__ = "general-operation" + + def setup(self): + LOG.debug("config:%s context:%s" % (self._config, self._context)) + host = self._context.get(self._config['host'], None) + ip = host.get("ip", None) + user = host.get("user", "root") + key_filename = host.get("key_filename", "~/.ssh/id_rsa") + + self.connection = ssh.SSH(user, ip, key_filename=key_filename) + self.connection.wait(timeout=600) + LOG.debug("ssh host success!") + + self.key = self._config['key'] + + if "action_parameter" in self._config: + actionParameter = self._config['action_parameter'] + str = buildshellparams(actionParameter) + l = list(item for item in actionParameter.values()) + self.action_param = str.format(*l) + + if "rollback_parameter" in self._config: + rollbackParameter = self._config['rollback_parameter'] + str = buildshellparams(rollbackParameter) + l = list(item for item in rollbackParameter.values()) + self.rollback_param = str.format(*l) + + self.operation_cfgs = BaseOperation.operation_cfgs.get(self.key) + self.action_script = self.get_script_fullpath( + self.operation_cfgs['action_script']) + self.rollback_script = self.get_script_fullpath( + self.operation_cfgs['rollback_script']) + + def run(self): + if "action_parameter" in self._config: + exit_status, stdout, stderr = self.connection.execute( + self.action_param, + stdin=open(self.action_script, "r")) + else: + exit_status, stdout, stderr = self.connection.execute( + "/bin/sh -s ", + stdin=open(self.action_script, "r")) + + if exit_status == 0: + LOG.debug("success,the operation's output is: {0}".format(stdout)) + else: + LOG.error( + "the operation's error, stdout:%s, stderr:%s" % + (stdout, stderr)) + + def rollback(self): + if "rollback_parameter" in self._config: + exit_status, stdout, stderr = self.connection.execute( + self.rollback_param, + stdin=open(self.rollback_script, "r")) + else: + exit_status, stdout, stderr = self.connection.execute( + "/bin/sh -s ", + stdin=open(self.rollback_script, "r")) diff --git a/yardstick/benchmark/scenarios/availability/operation_conf.yaml b/yardstick/benchmark/scenarios/availability/operation_conf.yaml new file mode 100644 index 000000000..78c996d05 --- /dev/null +++ b/yardstick/benchmark/scenarios/availability/operation_conf.yaml @@ -0,0 +1,16 @@ +--- +# sample config file for ha test +# +schema: "yardstick:task:0.1" + +nova-create-instance: + action_script: ha_tools/nova/create_instance_from_image.bash + rollback_script: ha_tools/nova/delete_instance.bash + +swift_upload_file: + action_script: ha_tools/swift/upload.bash + rollback_script: ha_tools/swift/delete.bash + +swift_download_file: + action_script: ha_tools/swift/download.bash + rollback_script: ha_tools/file/remove_file.bash
\ No newline at end of file |