From 9a35da73aead35b0c151be18ea915d0f3f3f158c Mon Sep 17 00:00:00 2001 From: epriestley Date: Tue, 23 Jul 2013 12:10:30 -0700 Subject: [PATCH] Use modern UI elements to show daemons in Daemons Summary: Ref T3557. Slightly improves display of daemons: - Makes status more clear (through colors, explanatory text, icons, and explicit descriptions instead of symbols). - Particularly, the "wait" status is now communicated as a normal status ("waiting a moment...") with a calm blue color. - Uses modern responsive elements. Test Plan: {F51232} Reviewers: btrahan Reviewed By: btrahan CC: aran Maniphest Tasks: T3557 Differential Revision: https://secure.phabricator.com/D6539 --- .../PhabricatorDaemonConsoleController.php | 12 +- .../PhabricatorDaemonLogListController.php | 14 +- .../view/PhabricatorDaemonLogListView.php | 159 ++++++++---------- 3 files changed, 85 insertions(+), 100 deletions(-) diff --git a/src/applications/daemon/controller/PhabricatorDaemonConsoleController.php b/src/applications/daemon/controller/PhabricatorDaemonConsoleController.php index 02effe4efe..63c76e3ae3 100644 --- a/src/applications/daemon/controller/PhabricatorDaemonConsoleController.php +++ b/src/applications/daemon/controller/PhabricatorDaemonConsoleController.php @@ -61,15 +61,14 @@ final class PhabricatorDaemonConsoleController '`status` = %s ORDER BY id DESC', 'run'); + + $daemon_header = id(new PhabricatorHeaderView()) + ->setHeader(pht('Recent Daemons')); + $daemon_table = new PhabricatorDaemonLogListView(); $daemon_table->setUser($user); $daemon_table->setDaemonLogs($logs); - $daemon_panel = new AphrontPanelView(); - $daemon_panel->setHeader(pht('Active Daemons')); - $daemon_panel->appendChild($daemon_table); - $daemon_panel->setNoBackground(); - $tasks = id(new PhabricatorWorkerActiveTask())->loadAllWhere( 'leaseOwner IS NOT NULL'); @@ -155,7 +154,8 @@ final class PhabricatorDaemonConsoleController $nav->appendChild( array( $completed_panel, - $daemon_panel, + $daemon_header, + $daemon_table, $queued_panel, $leased_panel, )); diff --git a/src/applications/daemon/controller/PhabricatorDaemonLogListController.php b/src/applications/daemon/controller/PhabricatorDaemonLogListController.php index 434bf48aaf..9dd56ee74a 100644 --- a/src/applications/daemon/controller/PhabricatorDaemonLogListController.php +++ b/src/applications/daemon/controller/PhabricatorDaemonLogListController.php @@ -24,20 +24,22 @@ final class PhabricatorDaemonLogListController $daemon_table->setUser($request->getUser()); $daemon_table->setDaemonLogs($logs); - $daemon_panel = new AphrontPanelView(); - $daemon_panel->setHeader(pht('All Daemons')); - $daemon_panel->appendChild($daemon_table); - $daemon_panel->appendChild($pager); - $daemon_panel->setNoBackground(); + $crumbs = $this->buildApplicationCrumbs(); + $crumbs->addCrumb( + id(new PhabricatorCrumbView()) + ->setName(pht('All Daemons'))); $nav = $this->buildSideNavView(); $nav->selectFilter('log'); - $nav->appendChild($daemon_panel); + $nav->setCrumbs($crumbs); + $nav->appendChild($daemon_table); return $this->buildApplicationPage( $nav, array( 'title' => pht('All Daemons'), + 'device' => true, + 'dust' => true, )); } diff --git a/src/applications/daemon/view/PhabricatorDaemonLogListView.php b/src/applications/daemon/view/PhabricatorDaemonLogListView.php index a78e386dbe..87eb00e721 100644 --- a/src/applications/daemon/view/PhabricatorDaemonLogListView.php +++ b/src/applications/daemon/view/PhabricatorDaemonLogListView.php @@ -17,112 +17,95 @@ final class PhabricatorDaemonLogListView extends AphrontView { throw new Exception("Call setUser() before rendering!"); } + $list = id(new PhabricatorObjectItemListView()); foreach ($this->daemonLogs as $log) { - $epoch = $log->getDateCreated(); + + // TODO: VVV Move this stuff to a Query class. VVV + + $expect_heartbeat = (3 * PhutilDaemonOverseer::HEARTBEAT_WAIT); + $assume_dead = (30 * PhutilDaemonOverseer::HEARTBEAT_WAIT); + + $status_running = PhabricatorDaemonLog::STATUS_RUNNING; + $status_unknown = PhabricatorDaemonLog::STATUS_UNKNOWN; + $status_wait = PhabricatorDaemonLog::STATUS_WAIT; + $status_exited = PhabricatorDaemonLog::STATUS_EXITED; + $status_dead = PhabricatorDaemonLog::STATUS_DEAD; $status = $log->getStatus(); - if ($log->getHost() == php_uname('n') && - $status != PhabricatorDaemonLog::STATUS_EXITED && - $status != PhabricatorDaemonLog::STATUS_DEAD) { - - $pid = $log->getPID(); - $is_running = PhabricatorDaemonReference::isProcessRunning($pid); - if (!$is_running) { - $guard = AphrontWriteGuard::beginScopedUnguardedWrites(); - $log->setStatus(PhabricatorDaemonLog::STATUS_DEAD); - $log->save(); - unset($guard); - $status = PhabricatorDaemonLog::STATUS_DEAD; - } + $heartbeat_timeout = $log->getDateModified() + $expect_heartbeat; + if ($status == $status_running && $heartbeat_timeout < time()) { + $status = $status_unknown; } - $heartbeat_timeout = - $log->getDateModified() + 3 * PhutilDaemonOverseer::HEARTBEAT_WAIT; - if ($status == PhabricatorDaemonLog::STATUS_RUNNING && - $heartbeat_timeout < time()) { - $status = PhabricatorDaemonLog::STATUS_UNKNOWN; + if ($status == $status_unknown && $assume_dead < time()) { + $guard = AphrontWriteGuard::beginScopedUnguardedWrites(); + $log->setStatus($status_dead)->save(); + unset($guard); } - switch ($status) { - case PhabricatorDaemonLog::STATUS_RUNNING: - $style = 'color: #00cc00'; - $title = 'Running'; - $symbol = "\xE2\x80\xA2"; - break; - case PhabricatorDaemonLog::STATUS_DEAD: - $style = 'color: #cc0000'; - $title = 'Died'; - $symbol = "\xE2\x80\xA2"; - break; - case PhabricatorDaemonLog::STATUS_EXITED: - $style = 'color: #000000'; - $title = 'Exited'; - $symbol = "\xE2\x80\xA2"; - break; - case PhabricatorDaemonLog::STATUS_UNKNOWN: - default: // fallthrough - $style = 'color: #888888'; - $title = 'Unknown'; - $symbol = '?'; - } - - if ($status != PhabricatorDaemonLog::STATUS_RUNNING && + if ($status != $status_running && $log->getDateModified() + (3 * 86400) < time()) { // Don't show rows that haven't been running for more than // three days. We should probably prune these out of the // DB similar to the code above, but we don't need to be // conservative and do it only on the same host + + // TODO: This should not apply to the "all daemons" view! continue; } - $running = phutil_tag( - 'span', - array( - 'style' => $style, - 'title' => $title, - ), - $symbol); + // TODO: ^^^^ ALL THAT STUFF ^^^ - $rows[] = array( - $running, - $log->getDaemon(), - $log->getHost(), - $log->getPID(), - phabricator_date($epoch, $this->user), - phabricator_time($epoch, $this->user), - phutil_tag( - 'a', - array( - 'href' => '/daemon/log/'.$log->getID().'/', - 'class' => 'button small grey', - ), - 'View Log'), - ); + $id = $log->getID(); + $epoch = $log->getDateCreated(); + + $item = id(new PhabricatorObjectItemView()) + ->setObjectName(pht("Daemon %s", $id)) + ->setHeader($log->getDaemon()) + ->setHref("/daemon/log/{$id}/") + ->addIcon('none', phabricator_datetime($epoch, $this->user)); + + switch ($status) { + case PhabricatorDaemonLog::STATUS_RUNNING: + $item->setBarColor('green'); + $item->addAttribute(pht('This daemon is running.')); + break; + case PhabricatorDaemonLog::STATUS_DEAD: + $item->setBarColor('red'); + $item->addAttribute( + pht( + 'This daemon is lost or exited uncleanly, and is presumed '. + 'dead.')); + $item->addIcon('delete', pht('Dead')); + break; + case PhabricatorDaemonLog::STATUS_EXITED: + $item->setDisabled(true); + $item->addAttribute(pht('This daemon exited cleanly.')); + $item->addIcon('enable-grey', pht('Exited')); + break; + case PhabricatorDaemonLog::STATUS_WAIT: + $item->setBarColor('blue'); + $item->addAttribute( + pht( + 'This daemon encountered an error recently and is waiting a '. + 'moment to restart.')); + $item->addIcon('perflab-grey', pht('Waiting')); + break; + case PhabricatorDaemonLog::STATUS_UNKNOWN: + default: + $item->setBarColor('orange'); + $item->addAttribute( + pht( + 'This daemon has not reported its status recently. It may '. + 'have exited uncleanly.')); + $item->addIcon('warning', pht('Unknown')); + break; + } + + $list->addItem($item); } - $daemon_table = new AphrontTableView($rows); - $daemon_table->setHeaders( - array( - '', - 'Daemon', - 'Host', - 'PID', - 'Date', - 'Time', - 'View', - )); - $daemon_table->setColumnClasses( - array( - '', - 'wide wrap', - '', - '', - '', - 'right', - 'action', - )); - - return $daemon_table->render(); + return $list; } }