diff options
author | Simon Rettberg | 2022-07-01 17:51:36 +0200 |
---|---|---|
committer | Simon Rettberg | 2022-07-01 17:51:36 +0200 |
commit | cebc0c48fd86750eb9b45745a2d68c5e5d71d9f8 (patch) | |
tree | 778a2bc16e4fda122015908f89e7c7590d803701 /modules-available/vmstore/inc | |
parent | [rebootcontrol] Fix permission check (diff) | |
download | slx-admin-cebc0c48fd86750eb9b45745a2d68c5e5d71d9f8.tar.gz slx-admin-cebc0c48fd86750eb9b45745a2d68c5e5d71d9f8.tar.xz slx-admin-cebc0c48fd86750eb9b45745a2d68c5e5d71d9f8.zip |
[dnbd3/vmstore] Add first version of speedtest/benchmark GUI
Diffstat (limited to 'modules-available/vmstore/inc')
-rw-r--r-- | modules-available/vmstore/inc/vmstorebenchmark.inc.php | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/modules-available/vmstore/inc/vmstorebenchmark.inc.php b/modules-available/vmstore/inc/vmstorebenchmark.inc.php new file mode 100644 index 00000000..30b0c65c --- /dev/null +++ b/modules-available/vmstore/inc/vmstorebenchmark.inc.php @@ -0,0 +1,65 @@ +<?php + +class VmStoreBenchmark +{ + + /** + * @param string[] $machineUuids List of UUIDs + * @return void + */ + public static function prepareSelectDialog(array $uuids) + { + Module::isAvailable('rebootcontrol'); + User::assertPermission('.vmstore.benchmark'); + $uuids = array_values(Request::post('uuid', Request::REQUIRED, 'array')); + $machines = RebootUtils::getFilteredMachineList($uuids, '.vmstore.benchmark'); + if ($machines === false) + return; + $machines = array_column($machines, 'machineuuid'); + $id = mt_rand() . time(); + Session::set('benchmark-' . $id, ['machines' => $machines], 60); + Util::redirect('?do=vmstore&show=benchmark&action=select&id=' . $id); + } + + /** + * @param array $machineUuids + * @param string $image + * @param bool $nfs + * @param int $start timestamp when the clients should start + * @return ?string taskId, or null on error + */ + public static function start(string $id, array $machineUuids, string $image, bool $nfs, int &$start) + { + Module::isAvailable('rebootcontrol'); + $clients = Database::queryAll('SELECT machineuuid, clientip FROM machine WHERE machineuuid IN (:uuids)', + ['uuids' => $machineUuids]); + if (empty($clients)) { + ErrorHandler::traceError('Cannot start benchmark: No matching clients'); + } + // The more clients we have, the longer it takes to SSH into all of them. + // As of 2022, RemoteExec processes 4 clients in parallel + $start = ceil(count($clients) / 4 + 5 + time()); + $nfsOpt = $nfs ? '--nfs' : ''; + $command = <<<COMMAND +( +exec &> /dev/null < /dev/null +setsid +image_speedcheck --start $start --console $nfsOpt --file "$image" > "/tmp/speedcheck-$id" +) & +COMMAND; + $task = RebootControl::runScript($clients, $command); + return $task['id'] ?? null; + } + + public static function parseBenchLine(string $line): array + { + $out = ['cpu' => [], 'net' => []]; + foreach (explode(',', $line) as $elem) { + $elem = explode('+', $elem); + $out['net'][] = ['x' => (int)$elem[0], 'y' => (int)$elem[1]]; + //$out['cpu'][] = ['x' => $elem[0], 'y' => $elem[2]]; + } + return $out; + } + +}
\ No newline at end of file |