Page MenuHomePhabricator

D7595.id17137.diff
No OneTemporary

D7595.id17137.diff

Index: src/__phutil_library_map__.php
===================================================================
--- src/__phutil_library_map__.php
+++ src/__phutil_library_map__.php
@@ -667,6 +667,7 @@
'HarbormasterBuildItemQuery' => 'applications/harbormaster/query/HarbormasterBuildItemQuery.php',
'HarbormasterBuildLog' => 'applications/harbormaster/storage/build/HarbormasterBuildLog.php',
'HarbormasterBuildLogQuery' => 'applications/harbormaster/query/HarbormasterBuildLogQuery.php',
+ 'HarbormasterBuildMachineSearchEngine' => 'applications/harbormaster/query/HarbormasterBuildMachineSearchEngine.php',
'HarbormasterBuildPlan' => 'applications/harbormaster/storage/configuration/HarbormasterBuildPlan.php',
'HarbormasterBuildPlanEditor' => 'applications/harbormaster/editor/HarbormasterBuildPlanEditor.php',
'HarbormasterBuildPlanQuery' => 'applications/harbormaster/query/HarbormasterBuildPlanQuery.php',
@@ -689,10 +690,13 @@
'HarbormasterBuildableQuery' => 'applications/harbormaster/query/HarbormasterBuildableQuery.php',
'HarbormasterBuildableSearchEngine' => 'applications/harbormaster/query/HarbormasterBuildableSearchEngine.php',
'HarbormasterBuildableViewController' => 'applications/harbormaster/controller/HarbormasterBuildableViewController.php',
+ 'HarbormasterCapabilityManageMachines' => 'applications/harbormaster/capability/HarbormasterCapabilityManageMachines.php',
'HarbormasterCapabilityManagePlans' => 'applications/harbormaster/capability/HarbormasterCapabilityManagePlans.php',
'HarbormasterController' => 'applications/harbormaster/controller/HarbormasterController.php',
'HarbormasterDAO' => 'applications/harbormaster/storage/HarbormasterDAO.php',
'HarbormasterHTTPRequestBuildStepImplementation' => 'applications/harbormaster/step/HarbormasterHTTPRequestBuildStepImplementation.php',
+ 'HarbormasterMachineController' => 'applications/harbormaster/controller/HarbormasterMachineController.php',
+ 'HarbormasterMachineListController' => 'applications/harbormaster/controller/HarbormasterMachineListController.php',
'HarbormasterObject' => 'applications/harbormaster/storage/HarbormasterObject.php',
'HarbormasterPHIDTypeBuild' => 'applications/harbormaster/phid/HarbormasterPHIDTypeBuild.php',
'HarbormasterPHIDTypeBuildItem' => 'applications/harbormaster/phid/HarbormasterPHIDTypeBuildItem.php',
@@ -2930,10 +2934,14 @@
'DrydockManagementWaitForLeaseWorkflow' => 'DrydockManagementWorkflow',
'DrydockManagementWorkflow' => 'PhutilArgumentWorkflow',
'DrydockPreallocatedHostBlueprint' => 'DrydockBlueprint',
- 'DrydockResource' => 'DrydockDAO',
+ 'DrydockResource' =>
+ array(
+ 0 => 'DrydockDAO',
+ 1 => 'PhabricatorPolicyInterface',
+ ),
'DrydockResourceCloseController' => 'DrydockController',
'DrydockResourceListController' => 'DrydockController',
- 'DrydockResourceQuery' => 'PhabricatorOffsetPagedQuery',
+ 'DrydockResourceQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
'DrydockResourceStatus' => 'DrydockConstants',
'DrydockResourceViewController' => 'DrydockController',
'DrydockSSHCommandInterface' => 'DrydockCommandInterface',
@@ -2964,6 +2972,7 @@
1 => 'PhabricatorPolicyInterface',
),
'HarbormasterBuildLogQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
+ 'HarbormasterBuildMachineSearchEngine' => 'PhabricatorApplicationSearchEngine',
'HarbormasterBuildPlan' =>
array(
0 => 'HarbormasterDAO',
@@ -3003,10 +3012,17 @@
'HarbormasterBuildableQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
'HarbormasterBuildableSearchEngine' => 'PhabricatorApplicationSearchEngine',
'HarbormasterBuildableViewController' => 'HarbormasterController',
+ 'HarbormasterCapabilityManageMachines' => 'PhabricatorPolicyCapability',
'HarbormasterCapabilityManagePlans' => 'PhabricatorPolicyCapability',
'HarbormasterController' => 'PhabricatorController',
'HarbormasterDAO' => 'PhabricatorLiskDAO',
'HarbormasterHTTPRequestBuildStepImplementation' => 'VariableBuildStepImplementation',
+ 'HarbormasterMachineController' => 'PhabricatorController',
+ 'HarbormasterMachineListController' =>
+ array(
+ 0 => 'HarbormasterMachineController',
+ 1 => 'PhabricatorApplicationSearchResultsControllerInterface',
+ ),
'HarbormasterObject' => 'HarbormasterDAO',
'HarbormasterPHIDTypeBuild' => 'PhabricatorPHIDType',
'HarbormasterPHIDTypeBuildItem' => 'PhabricatorPHIDType',
Index: src/applications/drydock/controller/DrydockResourceListController.php
===================================================================
--- src/applications/drydock/controller/DrydockResourceListController.php
+++ src/applications/drydock/controller/DrydockResourceListController.php
@@ -14,6 +14,7 @@
$pager = new AphrontPagerView();
$pager->setURI(new PhutilURI('/drydock/resource/'), 'offset');
$resources = id(new DrydockResourceQuery())
+ ->setViewer($user)
->executeWithOffsetPager($pager);
$resource_list = $this->buildResourceListView($resources);
Index: src/applications/drydock/query/DrydockResourceQuery.php
===================================================================
--- src/applications/drydock/query/DrydockResourceQuery.php
+++ src/applications/drydock/query/DrydockResourceQuery.php
@@ -1,15 +1,33 @@
<?php
-final class DrydockResourceQuery extends PhabricatorOffsetPagedQuery {
+final class DrydockResourceQuery
+ extends PhabricatorCursorPagedPolicyAwareQuery {
private $ids;
+ private $statuses;
+ private $types;
public function withIDs(array $ids) {
$this->ids = $ids;
return $this;
}
- public function execute() {
+ public function withTypes(array $types) {
+ $this->types = $types;
+ return $this;
+ }
+
+ public function withStatuses(array $statuses) {
+ $this->statuses = $statuses;
+ return $this;
+ }
+
+ public function withAttributes(array $attributes) {
+ // TODO: Make this work in some efficient way...
+ return $this;
+ }
+
+ public function loadPage() {
$table = new DrydockResource();
$conn_r = $table->establishConnection('r');
@@ -36,11 +54,27 @@
$this->ids);
}
+ if ($this->types) {
+ $where[] = qsprintf(
+ $conn_r,
+ 'type IN (%Ls)',
+ $this->types);
+ }
+
+ if ($this->statuses) {
+ $where[] = qsprintf(
+ $conn_r,
+ 'status IN (%Ls)',
+ $this->statuses);
+ }
+
+ $where[] = $this->buildPagingClause($conn_r);
+
return $this->formatWhereClause($where);
}
- private function buildOrderClause(AphrontDatabaseConnection $conn_r) {
- return qsprintf($conn_r, 'ORDER BY id DESC');
+ public function getQueryApplicationClass() {
+ return 'PhabricatorApplicationDrydock';
}
}
Index: src/applications/drydock/storage/DrydockResource.php
===================================================================
--- src/applications/drydock/storage/DrydockResource.php
+++ src/applications/drydock/storage/DrydockResource.php
@@ -1,6 +1,7 @@
<?php
-final class DrydockResource extends DrydockDAO {
+final class DrydockResource extends DrydockDAO
+ implements PhabricatorPolicyInterface {
protected $id;
protected $phid;
@@ -84,4 +85,28 @@
$this->saveTransaction();
}
+
+/* -( PhabricatorPolicyInterface )----------------------------------------- */
+
+
+ public function getCapabilities() {
+ return array(
+ PhabricatorPolicyCapability::CAN_VIEW,
+ );
+ }
+
+ public function getPolicy($capability) {
+ switch ($capability) {
+ case PhabricatorPolicyCapability::CAN_VIEW:
+ return PhabricatorPolicies::getMostOpenPolicy();
+ }
+ }
+
+ public function hasAutomaticCapability($capability, PhabricatorUser $viewer) {
+ return false;
+ }
+
+ public function describeAutomaticCapability($capability) {
+ return null;
+ }
}
Index: src/applications/harbormaster/application/PhabricatorApplicationHarbormaster.php
===================================================================
--- src/applications/harbormaster/application/PhabricatorApplicationHarbormaster.php
+++ src/applications/harbormaster/application/PhabricatorApplicationHarbormaster.php
@@ -67,6 +67,10 @@
'edit/(?:(?P<id>\d+)/)?' => 'HarbormasterPlanEditController',
'(?P<id>\d+)/' => 'HarbormasterPlanViewController',
),
+ 'machine/' => array(
+ '(?:query/(?P<queryKey>[^/]+)/)?'
+ => 'HarbormasterMachineListController'
+ ),
),
);
}
@@ -77,6 +81,10 @@
'caption' => pht('Can create and manage build plans.'),
'default' => PhabricatorPolicies::POLICY_ADMIN,
),
+ HarbormasterCapabilityManageMachines::CAPABILITY => array(
+ 'caption' => pht('Can create and manage build machines.'),
+ 'default' => PhabricatorPolicies::POLICY_ADMIN,
+ ),
);
}
Index: src/applications/harbormaster/capability/HarbormasterCapabilityManageMachines.php
===================================================================
--- /dev/null
+++ src/applications/harbormaster/capability/HarbormasterCapabilityManageMachines.php
@@ -0,0 +1,21 @@
+<?php
+
+final class HarbormasterCapabilityManageMachines
+ extends PhabricatorPolicyCapability {
+
+ const CAPABILITY = 'harbormaster.machines';
+
+ public function getCapabilityKey() {
+ return self::CAPABILITY;
+ }
+
+ public function getCapabilityName() {
+ return pht('Can Manage Build Machines');
+ }
+
+ public function describeCapabilityRejection() {
+ return pht(
+ 'You do not have permission to manage Harbormaster build machines.');
+ }
+
+}
Index: src/applications/harbormaster/controller/HarbormasterBuildableListController.php
===================================================================
--- src/applications/harbormaster/controller/HarbormasterBuildableListController.php
+++ src/applications/harbormaster/controller/HarbormasterBuildableListController.php
@@ -88,6 +88,7 @@
$nav->addLabel('Utilities');
$nav->addFilter('buildable/edit/', pht('New Manual Build'));
$nav->addFilter('plan/', pht('Manage Build Plans'));
+ $nav->addFilter('machine/', pht('Manage Build Machines'));
$nav->selectFilter(null);
Index: src/applications/harbormaster/controller/HarbormasterMachineController.php
===================================================================
--- /dev/null
+++ src/applications/harbormaster/controller/HarbormasterMachineController.php
@@ -0,0 +1,16 @@
+<?php
+
+abstract class HarbormasterMachineController extends PhabricatorController {
+
+ public function buildApplicationCrumbs() {
+ $crumbs = parent::buildApplicationCrumbs();
+
+ $crumbs->addCrumb(
+ id(new PhabricatorCrumbView())
+ ->setName(pht('Build Machines'))
+ ->setHref($this->getApplicationURI('machine/')));
+
+ return $crumbs;
+ }
+
+}
Index: src/applications/harbormaster/controller/HarbormasterMachineListController.php
===================================================================
--- /dev/null
+++ src/applications/harbormaster/controller/HarbormasterMachineListController.php
@@ -0,0 +1,96 @@
+<?php
+
+final class HarbormasterMachineListController
+ extends HarbormasterMachineController
+ implements PhabricatorApplicationSearchResultsControllerInterface {
+
+ private $queryKey;
+
+ public function shouldAllowPublic() {
+ return true;
+ }
+
+ public function willProcessRequest(array $data) {
+ $this->queryKey = idx($data, 'queryKey');
+ }
+
+ public function processRequest() {
+ $request = $this->getRequest();
+ $controller = id(new PhabricatorApplicationSearchController($request))
+ ->setQueryKey($this->queryKey)
+ ->setSearchEngine(new HarbormasterBuildMachineSearchEngine())
+ ->setNavigation($this->buildSideNavView());
+
+ return $this->delegateToController($controller);
+ }
+
+ public function renderResultsList(
+ array $machines,
+ PhabricatorSavedQuery $query) {
+ assert_instances_of($machines, 'DrydockResource');
+
+ $viewer = $this->getRequest()->getUser();
+
+ $list = new PHUIObjectItemListView();
+ foreach ($machines as $machine) {
+ $item = id(new PHUIObjectItemView())
+ ->setObjectName(pht('Machine %d', $machine->getID()))
+ ->setHeader($machine->getAttribute('host'));
+
+ $item->setHref("/drydock/resource/".$machine->getID());
+
+ $status = DrydockResourceStatus::getNameForStatus($machine->getStatus());
+ $item->addAttribute($status);
+
+ switch ($machine->getStatus()) {
+ case DrydockResourceStatus::STATUS_PENDING:
+ $item->setBarColor('yellow');
+ break;
+ case DrydockResourceStatus::STATUS_OPEN:
+ $item->setBarColor('green');
+ break;
+ case DrydockResourceStatus::STATUS_DESTROYED:
+ $item->setBarColor('black');
+ break;
+ default:
+ $item->setBarColor('red');
+ break;
+ }
+
+ $item->addAttribute($machine->getAttribute('path'));
+
+ $list->addItem($item);
+ }
+
+ // TODO: Some sort of better notice that tells people why they can't
+ // edit build machines...
+ $drydock_notice = id(new AphrontErrorView())
+ ->setSeverity(AphrontErrorView::SEVERITY_NOTICE)
+ ->setTitle(pht('Drydock'))
+ ->appendChild(pht(
+ 'The authoritive source for Harbormaster build machines '.
+ 'is Drydock.'));
+
+ return array($drydock_notice, $list);
+ }
+
+ public function buildSideNavView($for_app = false) {
+ $user = $this->getRequest()->getUser();
+
+ $nav = new AphrontSideNavFilterView();
+ $nav->setBaseURI(new PhutilURI($this->getApplicationURI()));
+
+ id(new HarbormasterBuildMachineSearchEngine())
+ ->setViewer($user)
+ ->addNavigationItems($nav->getMenu());
+
+ $nav->selectFilter(null);
+
+ return $nav;
+ }
+
+ public function buildApplicationMenu() {
+ return $this->buildSideNavView(true)->getMenu();
+ }
+
+}
Index: src/applications/harbormaster/query/HarbormasterBuildMachineSearchEngine.php
===================================================================
--- /dev/null
+++ src/applications/harbormaster/query/HarbormasterBuildMachineSearchEngine.php
@@ -0,0 +1,63 @@
+<?php
+
+final class HarbormasterBuildMachineSearchEngine
+ extends PhabricatorApplicationSearchEngine {
+
+ public function buildSavedQueryFromRequest(AphrontRequest $request) {
+ $saved = new PhabricatorSavedQuery();
+
+ return $saved;
+ }
+
+ public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
+ $query = id(new DrydockResourceQuery());
+
+ // Only search resources that are of type 'host'.
+ $query->withTypes(array('host'));
+ $query->withAttributes(array(
+ 'preallocated' => true)); // TODO: Make this work.
+
+ $statuses = $saved->getParameter('statuses');
+ if ($statuses) {
+ $query->withStatuses($statuses);
+ }
+
+ return $query;
+ }
+
+ public function buildSearchForm(
+ AphrontFormView $form,
+ PhabricatorSavedQuery $saved_query) {
+
+ }
+
+ protected function getURI($path) {
+ return '/harbormaster/machine/'.$path;
+ }
+
+ public function getBuiltinQueryNames() {
+ $names = array(
+ 'active' => pht('Active Build Machines'),
+ 'all' => pht('All Build Machines'),
+ );
+
+ return $names;
+ }
+
+ public function buildSavedQueryFromBuiltin($query_key) {
+
+ $query = $this->newSavedQuery();
+ $query->setQueryKey($query_key);
+
+ switch ($query_key) {
+ case 'active':
+ return $query
+ ->setParameter('statuses', array(DrydockResourceStatus::STATUS_OPEN));
+ case 'all':
+ return $query;
+ }
+
+ return parent::buildSavedQueryFromBuiltin($query_key);
+ }
+
+}

File Metadata

Mime Type
text/plain
Expires
Tue, Nov 4, 9:19 AM (3 h, 24 m)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
12723058
Default Alt Text
D7595.id17137.diff (15 KB)

Event Timeline