/** * validation method - may be overriden by sub-classes, but parent method * should still be invoked. returns TRUE if db options are valid, FALSE * otherwise * @return boolean */ protected function validate() { if ($valid = parent::validate()) { if (!isset($this->options['db_name'])) { $valid = FALSE; print_msg('--db_name argument is required for --db bigquery', isset($this->options['verbose']), __FILE__, __LINE__, TRUE); } else { if ($this->bq() !== NULL) { $valid = TRUE; print_msg('BigQuery connection successful', isset($this->options['verbose']), __FILE__, __LINE__); } else { print_msg('BigQuery connection failed', isset($this->options['verbose']), __FILE__, __LINE__, TRUE); } } } return $valid; }
/** * validation method - may be overriden by sub-classes, but parent method * should still be invoked. returns TRUE if db options are valid, FALSE * otherwise * @return boolean */ protected function validate() { if ($valid = parent::validate()) { $table = 'test_' . $this->getTableName(rand()); if ($this->mysql(sprintf('CREATE TABLE %s (id int)%s', $table, isset($this->options['db_mysql_engine']) ? ' ENGINE=' . $this->options['db_mysql_engine'] : '')) !== NULL) { // try to load some data into the table $fp = fopen($tmp = '/tmp/' . $table, 'w'); fwrite($fp, rand() . "\n" . rand()); fclose($fp); $query = sprintf("LOAD DATA LOCAL INFILE '%s' INTO TABLE %s", $tmp, $table); $imported = $this->mysql($query); unlink($tmp); $this->mysql('drop table ' . $table); $dropped = $this->mysql('desc ' . $table); if ($dropped !== NULL) { print_msg(sprintf('Unable to drop test table %s - check that user has DROP TABLE permissions', $table), isset($this->options['verbose']), __FILE__, __LINE__, TRUE); $valid = FALSE; } else { if ($imported !== NULL) { print_msg(sprintf('Validated MySQL connection by creating and importing data to a temporary table %s - table has been removed', $table), isset($this->options['verbose']), __FILE__, __LINE__); } else { $valid = FALSE; print_msg(sprintf('MySQL connection successful, but unable to import data using LOAD DATA LOCAL INFILE. Check these permissions for this user'), isset($this->options['verbose']), __FILE__, __LINE__, TRUE); } } } else { $valid = FALSE; print_msg(sprintf('MySQL connection failed - %s', $this->mysql() !== NULL ? 'user cannot create tables' : 'unable to connect to server'), isset($this->options['verbose']), __FILE__, __LINE__, TRUE); } } return $valid; }
/** * validation method - may be overriden by sub-classes, but parent method * should still be invoked. returns TRUE if db options are valid, FALSE * otherwise * @return boolean */ protected function validate() { if (!isset($this->valid) && parent::validate()) { $this->valid = TRUE; $validate = array('db_librato_color' => array('color' => TRUE), 'db_librato_display_max' => array('min' => 0), 'db_librato_display_min' => array('min' => 0), 'db_librato_period' => array('min' => 0), 'db_librato_type' => array('option' => array('counter', 'gauge')), 'db_user' => array('required' => TRUE), 'db_pswd' => array('required' => TRUE)); if ($validated = validate_options($this->options, $validate)) { $this->valid = FALSE; foreach ($validated as $param => $err) { print_msg(sprintf('--%s is not valid: %s', $param, $err), isset($this->options['verbose']), __FILE__, __LINE__, TRUE); } } else { $valueCol = 'db_librato_value'; if (!isset($this->options['db_librato_value'])) { $valueCol = 'db_librato_count'; if (!isset($this->options['db_librato_count']) || !isset($this->options['db_librato_sum'])) { $this->valid = FALSE; print_msg(sprintf('If --db_librato_value is not set, both --db_librato_count and --db_librato_sum MUST be specified'), isset($this->options['verbose']), __FILE__, __LINE__, TRUE); } else { if (count($this->options['db_librato_count']) != count($this->options['db_librato_sum'])) { $this->valid = FALSE; print_msg(sprintf('--db_librato_count and --db_librato_sum must be repeated the same number of times'), isset($this->options['verbose']), __FILE__, __LINE__, TRUE); } else { if (isset($this->options['db_librato_name']) && count($this->options['db_librato_name']) != count($this->options['db_librato_count'])) { $this->valid = FALSE; print_msg(sprintf('--db_librato_name and --db_librato_count must be repeated the same number of times'), isset($this->options['verbose']), __FILE__, __LINE__, TRUE); } } } } else { if (isset($this->options['db_librato_name']) && count($this->options['db_librato_name']) != count($this->options['db_librato_value'])) { $this->valid = FALSE; print_msg(sprintf('--db_librato_name and --db_librato_value must be repeated the same number of times'), isset($this->options['verbose']), __FILE__, __LINE__, TRUE); } else { if (isset($this->options['db_librato_count']) || isset($this->options['db_librato_sum']) || isset($this->options['db_librato_max']) || isset($this->options['db_librato_min']) || isset($this->options['db_librato_sum_squares'])) { $this->valid = FALSE; print_msg(sprintf('--db_librato_value cannot be set with --db_librato_count, --db_librato_sum, --db_librato_max, --db_librato_min or --db_librato_sum_squares because these parameters are mutually exclusive'), isset($this->options['verbose']), __FILE__, __LINE__, TRUE); } } } if ($this->valid) { foreach (array('db_librato_aggregate', 'db_librato_color', 'db_librato_count', 'db_librato_description', 'db_librato_display_max', 'db_librato_display_min', 'db_librato_display_name', 'db_librato_display_units_long', 'db_librato_display_units_short', 'db_librato_display_stacked', 'db_librato_display_transform', 'db_librato_max', 'db_librato_min', 'db_librato_measure_time', 'db_librato_period', 'db_librato_source', 'db_librato_sum', 'db_librato_summarize_function', 'db_librato_sum_squares', 'db_librato_type') as $param) { if (isset($this->options[$param]) && count($this->options[$param]) != count($this->options[$valueCol]) && count($this->options[$param]) != 1) { $this->valid = FALSE; print_msg(sprintf('--%s can only be set once or %d times (once for each --%s)', $param, count($this->options[$valueCol]), $valueCol), isset($this->options['verbose']), __FILE__, __LINE__, TRUE); } } } } if ($this->valid) { // validate credentials using GET request $curl = ch_curl(self::LIBRATO_METRICS_API_URL, 'GET', NULL, NULL, sprintf('%s:%s', $this->options['db_user'], $this->options['db_pswd']), '200-299', TRUE); $this->valid = ($response = json_decode($curl, TRUE)) ? TRUE : FALSE; if ($curl === NULL) { print_msg(sprintf('Librato API GET request to %s failed', self::LIBRATO_METRICS_API_URL), isset($this->options['verbose']), __FILE__, __LINE__, TRUE); } else { if ($curl === FALSE) { print_msg(sprintf('Librato API GET request to %s resulted in non 200 response code - API credentials may be invalid', self::LIBRATO_METRICS_API_URL), isset($this->options['verbose']), __FILE__, __LINE__, TRUE); } else { if ($curl && !$response) { print_msg(sprintf('Librato API GET request to %s successful, but body did not contain valid JSON', self::LIBRATO_METRICS_API_URL), isset($this->options['verbose']), __FILE__, __LINE__, TRUE); } else { print_msg(sprintf('Librato API GET request to %s successful. There are %d existing metrics', self::LIBRATO_METRICS_API_URL, count($response['metrics'])), isset($this->options['verbose']), __FILE__, __LINE__); } } } } } return $this->valid; }
/** * validation method - may be overriden by sub-classes, but parent method * should still be invoked. returns TRUE if db options are valid, FALSE * otherwise * @return boolean */ protected function validate() { if ($valid = parent::validate()) { if (isset($this->options['db_host'])) { if ($valid = ch_curl($this->getUrl(), 'HEAD', $this->getHeaders(), NULL, $this->getAuth())) { print_msg('Successfully validated callback using HEAD request', isset($this->options['verbose']), __FILE__, __LINE__); } else { print_msg('Unable to validate callback using HEAD request', isset($this->options['verbose']), __FILE__, __LINE__, TRUE); } } else { $valid = FALSE; print_msg('--db_host argument is required for --db callback', isset($this->options['verbose']), __FILE__, __LINE__, TRUE); } } return $valid; }
require_once dirname(__FILE__) . '/BlockStorageTest.php'; require_once dirname(__FILE__) . '/save/BenchmarkDb.php'; $status = 1; $args = parse_args(array('iteration:', 'nosave_fio', 'nostore_json', 'nostore_pdf', 'nostore_rrd', 'nostore_zip', 'v' => 'verbose')); // get result directories => each directory stores 1 iteration of results $dirs = array(); $dir = count($argv) > 1 && is_dir($argv[count($argv) - 1]) ? $argv[count($argv) - 1] : trim(shell_exec('pwd')); if (is_dir(sprintf('%s/1', $dir))) { $i = 1; while (is_dir($sdir = sprintf('%s/%d', $dir, $i++))) { $dirs[] = $sdir; } } else { $dirs[] = $dir; } if ($db =& BenchmarkDb::getDb()) { $db->tablePrefix = 'block_storage_'; // get results from each directory foreach ($dirs as $i => $dir) { $iteration = isset($args['iteration']) && preg_match('/([0-9]+)/', $args['iteration'], $m) ? $m[1] * 1 : $i + 1; print_msg(sprintf('Saving results in directory %s', $dir), isset($args['verbose']), __FILE__, __LINE__); // save report.pdf and report.zip foreach (array('nostore_pdf' => 'report.pdf', 'nostore_zip' => 'report.zip') as $arg => $file) { $file = sprintf('%s/%s', $dir, $file); if (!isset($args[$arg]) && file_exists($file)) { $pieces = explode('.', $file); $col = sprintf('report_%s', $pieces[count($pieces) - 1]); $saved = $db->saveArtifact($file, $col); if ($saved) { print_msg(sprintf('Saved %s successfully', basename($file)), isset($args['verbose']), __FILE__, __LINE__); } else {
/** * returns test results - an array of hashes each containing the results from * 1 test * @return array */ public function getResults() { $results = NULL; require_once sprintf('%s/benchmark/save/BenchmarkDb.php', dirname(__FILE__)); if ($db =& BenchmarkDb::getDb()) { $this->getRunOptions(); if ($results = isset($this->options['results']) ? $this->options['results'] : NULL) { $schema = $db->getSchema('network'); foreach (array_keys($this->options) as $key) { if (isset($schema[$key]) && preg_match('/^meta/', $key)) { foreach (array_keys($results) as $i) { if (!isset($results[$i][$key])) { $results[$i][$key] = trim(is_array($this->options[$key]) ? implode(' ', $this->options[$key]) : $this->options[$key]); if (!$results[$i][$key]) { unset($results[$i][$key]); } } else { if ($results[$i][$key] === FALSE) { unset($results[$i][$key]); } } } } } } } return $results; }
/** * validation method - may be overriden by sub-classes, but parent method * should still be invoked. returns TRUE if db options are valid, FALSE * otherwise * @return boolean */ protected function validate() { if ($valid = parent::validate()) { $table = 'test_' . $this->getTableName(rand()); if ($this->psql('create table ' . $table . ' (id int)') !== NULL) { // try to load some data into the table $fp = fopen($tmp = '/tmp/' . $table, 'w'); fwrite($fp, rand() . "\n" . rand()); fclose($fp); $query = sprintf("\\COPY %s FROM '%s' CSV", $table, $tmp); $imported = $this->psql($query); unlink($tmp); $this->psql('drop table ' . $table); $dropped = $this->psql('\\d+ ' . $table); if ($dropped !== NULL) { print_msg(sprintf('Unable to drop test table %s - check that user has DROP TABLE permissions', $table), isset($this->options['verbose']), __FILE__, __LINE__, TRUE); $valid = FALSE; } else { if ($imported !== NULL) { print_msg(sprintf('Validated PostgreSQL connection by creating and importing data to a temporary table %s - table has been removed', $table), isset($this->options['verbose']), __FILE__, __LINE__); } else { $valid = FALSE; print_msg(sprintf('PostgreSQL connection successful, but unable to import data using COPY. Check these permissions for this user'), isset($this->options['verbose']), __FILE__, __LINE__, TRUE); } } } else { $valid = FALSE; print_msg(sprintf('PostgreSQL connection failed - %s', $this->psql() !== NULL ? 'user cannot create tables' : 'unable to connect to server'), isset($this->options['verbose']), __FILE__, __LINE__, TRUE); } } return $valid; }