Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F18864921
D7595.id17137.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
15 KB
Referenced Files
None
Subscribers
None
D7595.id17137.diff
View Options
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
Details
Attached
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)
Attached To
Mode
D7595: Update a few things in Drydock for policies
Attached
Detach File
Event Timeline
Log In to Comment