1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-11-10 08:52:39 +01:00

Add a basic web UI for intracluster sync logs

Summary: Depends on D19798. Ref T13216. This puts at least a basic UI on top of sync logs.

Test Plan:
Viewed logs from the web UI and exported data. Note that these syncs are somewhat simulated since I my local cluster is somewhat-faked (i.e., not actually multiple machines).

{F5995899}

Reviewers: amckinley

Reviewed By: amckinley

Maniphest Tasks: T13216

Differential Revision: https://secure.phabricator.com/D19799
This commit is contained in:
epriestley 2018-11-08 10:14:46 -08:00
parent 1d7c960531
commit 315d857a8a
8 changed files with 272 additions and 4 deletions

View file

@ -992,6 +992,9 @@ phutil_register_library_map(array(
'DiffusionSymbolController' => 'applications/diffusion/controller/DiffusionSymbolController.php',
'DiffusionSymbolDatasource' => 'applications/diffusion/typeahead/DiffusionSymbolDatasource.php',
'DiffusionSymbolQuery' => 'applications/diffusion/query/DiffusionSymbolQuery.php',
'DiffusionSyncLogListController' => 'applications/diffusion/controller/DiffusionSyncLogListController.php',
'DiffusionSyncLogListView' => 'applications/diffusion/view/DiffusionSyncLogListView.php',
'DiffusionSyncLogSearchEngine' => 'applications/diffusion/query/DiffusionSyncLogSearchEngine.php',
'DiffusionTagListController' => 'applications/diffusion/controller/DiffusionTagListController.php',
'DiffusionTagListView' => 'applications/diffusion/view/DiffusionTagListView.php',
'DiffusionTagTableView' => 'applications/diffusion/view/DiffusionTagTableView.php',
@ -6367,6 +6370,9 @@ phutil_register_library_map(array(
'DiffusionSymbolController' => 'DiffusionController',
'DiffusionSymbolDatasource' => 'PhabricatorTypeaheadDatasource',
'DiffusionSymbolQuery' => 'PhabricatorOffsetPagedQuery',
'DiffusionSyncLogListController' => 'DiffusionLogController',
'DiffusionSyncLogListView' => 'AphrontView',
'DiffusionSyncLogSearchEngine' => 'PhabricatorApplicationSearchEngine',
'DiffusionTagListController' => 'DiffusionController',
'DiffusionTagListView' => 'DiffusionView',
'DiffusionTagTableView' => 'DiffusionView',

View file

@ -118,6 +118,9 @@ final class PhabricatorDiffusionApplication extends PhabricatorApplication {
$this->getQueryRoutePattern() => 'DiffusionPushLogListController',
'view/(?P<id>\d+)/' => 'DiffusionPushEventViewController',
),
'synclog/' => array(
$this->getQueryRoutePattern() => 'DiffusionSyncLogListController',
),
'pulllog/' => array(
$this->getQueryRoutePattern() => 'DiffusionPullLogListController',
),

View file

@ -370,8 +370,17 @@ final class DiffusionRepositoryController extends DiffusionController {
$action_view->addAction(
id(new PhabricatorActionView())
->setName(pht('View Push Logs'))
->setIcon('fa-list-alt')
->setIcon('fa-upload')
->setHref($push_uri));
$pull_uri = $this->getApplicationURI(
'synclog/?repositories='.$repository->getPHID());
$action_view->addAction(
id(new PhabricatorActionView())
->setName(pht('View Sync Logs'))
->setIcon('fa-exchange')
->setHref($pull_uri));
}
$pull_uri = $this->getApplicationURI(
@ -380,7 +389,7 @@ final class DiffusionRepositoryController extends DiffusionController {
$action_view->addAction(
id(new PhabricatorActionView())
->setName(pht('View Pull Logs'))
->setIcon('fa-list-alt')
->setIcon('fa-download')
->setHref($pull_uri));
return $action_view;

View file

@ -0,0 +1,17 @@
<?php
final class DiffusionSyncLogListController
extends DiffusionLogController {
public function handleRequest(AphrontRequest $request) {
return id(new DiffusionSyncLogSearchEngine())
->setController($this)
->buildResponse();
}
protected function buildApplicationCrumbs() {
return parent::buildApplicationCrumbs()
->addTextCrumb(pht('Sync Logs'), $this->getApplicationURI('synclog/'));
}
}

View file

@ -0,0 +1,154 @@
<?php
final class DiffusionSyncLogSearchEngine
extends PhabricatorApplicationSearchEngine {
public function getResultTypeDescription() {
return pht('Sync Logs');
}
public function getApplicationClassName() {
return 'PhabricatorDiffusionApplication';
}
public function newQuery() {
return new PhabricatorRepositorySyncEventQuery();
}
protected function buildQueryFromParameters(array $map) {
$query = $this->newQuery();
if ($map['repositoryPHIDs']) {
$query->withRepositoryPHIDs($map['repositoryPHIDs']);
}
if ($map['createdStart'] || $map['createdEnd']) {
$query->withEpochBetween(
$map['createdStart'],
$map['createdEnd']);
}
return $query;
}
protected function buildCustomSearchFields() {
return array(
id(new PhabricatorSearchDatasourceField())
->setDatasource(new DiffusionRepositoryDatasource())
->setKey('repositoryPHIDs')
->setAliases(array('repository', 'repositories', 'repositoryPHID'))
->setLabel(pht('Repositories'))
->setDescription(
pht('Search for sync logs for specific repositories.')),
id(new PhabricatorSearchDateField())
->setLabel(pht('Created After'))
->setKey('createdStart'),
id(new PhabricatorSearchDateField())
->setLabel(pht('Created Before'))
->setKey('createdEnd'),
);
}
protected function newExportFields() {
$viewer = $this->requireViewer();
$fields = array(
id(new PhabricatorPHIDExportField())
->setKey('repositoryPHID')
->setLabel(pht('Repository PHID')),
id(new PhabricatorStringExportField())
->setKey('repository')
->setLabel(pht('Repository')),
id(new PhabricatorPHIDExportField())
->setKey('devicePHID')
->setLabel(pht('Device PHID')),
id(new PhabricatorPHIDExportField())
->setKey('fromDevicePHID')
->setLabel(pht('From Device PHID')),
id(new PhabricatorIntExportField())
->setKey('deviceVersion')
->setLabel(pht('Device Version')),
id(new PhabricatorIntExportField())
->setKey('fromDeviceVersion')
->setLabel(pht('From Device Version')),
id(new PhabricatorStringExportField())
->setKey('result')
->setLabel(pht('Result')),
id(new PhabricatorIntExportField())
->setKey('code')
->setLabel(pht('Code')),
id(new PhabricatorEpochExportField())
->setKey('date')
->setLabel(pht('Date')),
id(new PhabricatorIntExportField())
->setKey('syncWait')
->setLabel(pht('Sync Wait')),
);
return $fields;
}
protected function newExportData(array $events) {
$viewer = $this->requireViewer();
$export = array();
foreach ($events as $event) {
$repository = $event->getRepository();
$repository_phid = $repository->getPHID();
$repository_name = $repository->getDisplayName();
$map = array(
'repositoryPHID' => $repository_phid,
'repository' => $repository_name,
'devicePHID' => $event->getDevicePHID(),
'fromDevicePHID' => $event->getFromDevicePHID(),
'deviceVersion' => $event->getDeviceVersion(),
'fromDeviceVersion' => $event->getFromDeviceVersion(),
'result' => $event->getResultType(),
'code' => $event->getResultCode(),
'date' => $event->getEpoch(),
'syncWait' => $event->getSyncWait(),
);
$export[] = $map;
}
return $export;
}
protected function getURI($path) {
return '/diffusion/synclog/'.$path;
}
protected function getBuiltinQueryNames() {
return array(
'all' => pht('All Sync Logs'),
);
}
public function buildSavedQueryFromBuiltin($query_key) {
$query = $this->newSavedQuery();
$query->setQueryKey($query_key);
switch ($query_key) {
case 'all':
return $query;
}
return parent::buildSavedQueryFromBuiltin($query_key);
}
protected function renderResultList(
array $logs,
PhabricatorSavedQuery $query,
array $handles) {
$table = id(new DiffusionSyncLogListView())
->setViewer($this->requireViewer())
->setLogs($logs);
return id(new PhabricatorApplicationSearchResultView())
->setTable($table);
}
}

View file

@ -0,0 +1,79 @@
<?php
final class DiffusionSyncLogListView extends AphrontView {
private $logs;
public function setLogs(array $logs) {
assert_instances_of($logs, 'PhabricatorRepositorySyncEvent');
$this->logs = $logs;
return $this;
}
public function render() {
$events = $this->logs;
$viewer = $this->getViewer();
$rows = array();
foreach ($events as $event) {
$repository = $event->getRepository();
$repository_link = phutil_tag(
'a',
array(
'href' => $repository->getURI(),
),
$repository->getDisplayName());
$event_id = $event->getID();
$sync_wait = pht('%sus', new PhutilNumber($event->getSyncWait()));
$device_link = $viewer->renderHandle($event->getDevicePHID());
$from_device_link = $viewer->renderHandle($event->getFromDevicePHID());
$rows[] = array(
$event_id,
$repository_link,
$device_link,
$from_device_link,
$event->getDeviceVersion(),
$event->getFromDeviceVersion(),
$event->getResultType(),
$event->getResultCode(),
phabricator_datetime($event->getEpoch(), $viewer),
$sync_wait,
);
}
$table = id(new AphrontTableView($rows))
->setHeaders(
array(
pht('Sync'),
pht('Repository'),
pht('Device'),
pht('From Device'),
pht('Version'),
pht('From Version'),
pht('Result'),
pht('Code'),
pht('Date'),
pht('Sync Wait'),
))
->setColumnClasses(
array(
'n',
'',
'',
'',
'n',
'n',
'wide right',
'n',
'right',
'n right',
));
return $table;
}
}

View file

@ -31,7 +31,7 @@ final class PhabricatorRepositorySyncEventQuery
}
public function newResultObject() {
return new PhabricatorRepositoryPullEvent();
return new PhabricatorRepositorySyncEvent();
}
protected function loadPage() {

View file

@ -65,7 +65,7 @@ final class PhabricatorRepositorySyncEvent
}
public function setProperty($key, $value) {
$this->properites[$key] = $value;
$this->properties[$key] = $value;
return $this;
}