--- /dev/null
+import logging
+import os
+import pexpect
+import time
+
+from teuthology.config import config as teuth_config
+from teuthology.exceptions import CommandFailedError
+
+from .ansible import Ansible, LoggerFile
+
+log = logging.getLogger(__name__)
+
+
+class CephMetrics(Ansible):
+ def __init__(self, ctx, config):
+ super(CephMetrics, self).__init__(ctx, config)
+ if 'repo' not in self.config:
+ self.config['repo'] = os.path.join(
+ teuth_config.ceph_git_base_url, 'cephmetrics.git')
+ if 'playbook' not in self.config:
+ self.config['playbook'] = './ansible/playbook.yml'
+
+ def get_inventory(self):
+ return False
+
+ def generate_hosts_file(self):
+ groups_to_roles = {
+ 'mons': 'mon',
+ 'mgrs': 'mgr',
+ 'mdss': 'mds',
+ 'osds': 'osd',
+ 'rgws': 'rgw',
+ 'clients': 'client',
+ 'ceph-grafana': 'cephmetrics',
+ }
+ hosts_dict = dict()
+ for group in sorted(groups_to_roles.keys()):
+ role_prefix = groups_to_roles[group]
+ want = lambda role: role.startswith(role_prefix)
+ if group not in hosts_dict:
+ hosts_dict[group] = dict(hosts=dict())
+ group_dict = hosts_dict[group]['hosts']
+ for (remote, roles) in self.cluster.only(want).remotes.iteritems():
+ hostname = remote.hostname
+ group_dict[hostname] = dict(
+ ansible_user=remote.user,
+ )
+ hosts_dict[group]['hosts'] = group_dict
+ # It might be preferable to use a YAML inventory file, but
+ # that won't work until an ansible release is out with:
+ # https://github.com/ansible/ansible/pull/30730
+ # Once that is done, we can simply do this:
+ # hosts_str = yaml.safe_dump(hosts_dict, default_flow_style=False)
+ # And then pass suffix='.yml' to _write_hosts_file().
+ hosts_lines = []
+ for group in hosts_dict.keys():
+ hosts_lines.append('[%s]' % group)
+ for host, vars_ in hosts_dict[group]['hosts'].items():
+ host_line = ' '.join(
+ [host] + map(
+ lambda tuple_: '='.join(tuple_),
+ vars_.items(),
+ )
+ )
+ hosts_lines.append(host_line)
+ hosts_lines.append('')
+ hosts_str = '\n'.join(hosts_lines)
+ self.inventory = self._write_hosts_file(hosts_str)
+ self.generated_inventory = True
+
+ def begin(self):
+ super(CephMetrics, self).begin()
+ wait_time = 5 * 60
+ self.log.info(
+ "Waiting %ss for data collection before running tests...",
+ wait_time,
+ )
+ time.sleep(wait_time)
+ self.run_tests()
+
+ def run_tests(self):
+ self.log.info("Running tests...")
+ command = "tox -e integration %s" % self.inventory
+ out, status = pexpect.run(
+ command,
+ cwd=self.repo_path,
+ logfile=LoggerFile(self.log.getChild('tests'), logging.INFO),
+ withexitstatus=True,
+ timeout=None,
+ )
+ if status != 0:
+ raise CommandFailedError(command, status)
+
+
+task = CephMetrics