mirror of
https://we.phorge.it/source/phorge.git
synced 2025-02-21 19:19:12 +01:00
Make DrydockLease a policy-aware object
Summary: Ref T2015. DrydockLease predates widespread adoption of policies. Make it -- and its query -- policy aware. Test Plan: Browsed leases from the web UI. Grepped for callsites. Reviewers: btrahan Reviewed By: btrahan CC: hach-que, aran Maniphest Tasks: T2015 Differential Revision: https://secure.phabricator.com/D7826
This commit is contained in:
parent
aad6b57c36
commit
6b2d480fe7
8 changed files with 66 additions and 36 deletions
|
@ -26,9 +26,10 @@ abstract class DrydockBlueprintImplementation {
|
|||
}
|
||||
|
||||
protected function loadLease($lease_id) {
|
||||
// TODO: Get rid of this?
|
||||
$query = id(new DrydockLeaseQuery())
|
||||
->setViewer(PhabricatorUser::getOmnipotentUser())
|
||||
->withIDs(array($lease_id))
|
||||
->needResources(true)
|
||||
->execute();
|
||||
|
||||
$lease = idx($query, $lease_id);
|
||||
|
|
|
@ -13,7 +13,7 @@ final class DrydockLeaseListController extends DrydockController {
|
|||
$pager->setOffset($request->getInt('offset'));
|
||||
|
||||
$leases = id(new DrydockLeaseQuery())
|
||||
->needResources(true)
|
||||
->setViewer($user)
|
||||
->executeWithOffsetPager($pager);
|
||||
|
||||
$title = pht('Leases');
|
||||
|
|
|
@ -12,7 +12,10 @@ final class DrydockLeaseReleaseController extends DrydockController {
|
|||
$request = $this->getRequest();
|
||||
$user = $request->getUser();
|
||||
|
||||
$lease = id(new DrydockLease())->load($this->id);
|
||||
$lease = id(new DrydockLeaseQuery())
|
||||
->setViewer($user)
|
||||
->withIDs(array($this->id))
|
||||
->executeOne();
|
||||
if (!$lease) {
|
||||
return new Aphront404Response();
|
||||
}
|
||||
|
@ -45,7 +48,7 @@ final class DrydockLeaseReleaseController extends DrydockController {
|
|||
return id(new AphrontDialogResponse())->setDialog($dialog);
|
||||
}
|
||||
|
||||
$resource = $lease->loadResource();
|
||||
$resource = $lease->getResource();
|
||||
$blueprint = $resource->getBlueprint();
|
||||
$blueprint->releaseLease($resource, $lease);
|
||||
|
||||
|
|
|
@ -29,8 +29,8 @@ final class DrydockResourceViewController extends DrydockController {
|
|||
$resource_uri = $this->getApplicationURI($resource_uri);
|
||||
|
||||
$leases = id(new DrydockLeaseQuery())
|
||||
->setViewer($user)
|
||||
->withResourceIDs(array($resource->getID()))
|
||||
->needResources(true)
|
||||
->execute();
|
||||
|
||||
$lease_list = $this->buildLeaseListView($leases);
|
||||
|
|
|
@ -25,14 +25,21 @@ final class DrydockManagementReleaseWorkflow
|
|||
"Specify one or more lease IDs to release.");
|
||||
}
|
||||
|
||||
$viewer = PhabricatorUser::getOmnipotentUser();
|
||||
|
||||
$leases = id(new DrydockLeaseQuery())
|
||||
->setViewer($viewer)
|
||||
->withIDs($ids)
|
||||
->execute();
|
||||
|
||||
foreach ($ids as $id) {
|
||||
$lease = id(new DrydockLease())->load($id);
|
||||
$lease = idx($leases, $id);
|
||||
if (!$lease) {
|
||||
$console->writeErr("Lease %d does not exist!\n", $id);
|
||||
} else if ($lease->getStatus() != DrydockLeaseStatus::STATUS_ACTIVE) {
|
||||
$console->writeErr("Lease %d is not 'active'!\n", $id);
|
||||
} else {
|
||||
$resource = $lease->loadResource();
|
||||
$resource = $lease->getResource();
|
||||
$blueprint = $resource->getBlueprint();
|
||||
$blueprint->releaseLease($resource, $lease);
|
||||
|
||||
|
|
|
@ -1,27 +1,22 @@
|
|||
<?php
|
||||
|
||||
final class DrydockLeaseQuery extends PhabricatorOffsetPagedQuery {
|
||||
final class DrydockLeaseQuery
|
||||
extends PhabricatorCursorPagedPolicyAwareQuery {
|
||||
|
||||
private $ids;
|
||||
private $resourceIDs;
|
||||
private $needResources;
|
||||
|
||||
public function withResourceIDs(array $ids) {
|
||||
$this->resourceIDs = $ids;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function withIDs(array $ids) {
|
||||
$this->ids = $ids;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function needResources($need_resources) {
|
||||
$this->needResources = $need_resources;
|
||||
public function withResourceIDs(array $ids) {
|
||||
$this->resourceIDs = $ids;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function execute() {
|
||||
public function loadPage() {
|
||||
$table = new DrydockLease();
|
||||
$conn_r = $table->establishConnection('r');
|
||||
|
||||
|
@ -33,25 +28,23 @@ final class DrydockLeaseQuery extends PhabricatorOffsetPagedQuery {
|
|||
$this->buildOrderClause($conn_r),
|
||||
$this->buildLimitClause($conn_r));
|
||||
|
||||
$leases = $table->loadAllFromArray($data);
|
||||
return $table->loadAllFromArray($data);
|
||||
}
|
||||
|
||||
if ($leases && $this->needResources) {
|
||||
$resources = id(new DrydockResource())->loadAllWhere(
|
||||
'id IN (%Ld)',
|
||||
mpull($leases, 'getResourceID'));
|
||||
public function willFilterPage(array $leases) {
|
||||
$resources = id(new DrydockResourceQuery())
|
||||
->setParentQuery($this)
|
||||
->setViewer($this->getViewer())
|
||||
->withIDs(mpull($leases, 'getResourceID'))
|
||||
->execute();
|
||||
|
||||
foreach ($leases as $key => $lease) {
|
||||
if ($lease->getResourceID()) {
|
||||
$resource = idx($resources, $lease->getResourceID());
|
||||
if ($resource) {
|
||||
if (!$resource) {
|
||||
unset($leases[$key]);
|
||||
continue;
|
||||
}
|
||||
$lease->attachResource($resource);
|
||||
} else {
|
||||
unset($leases[$key]);
|
||||
}
|
||||
} else {
|
||||
unset($leases[$key]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $leases;
|
||||
|
@ -74,11 +67,13 @@ final class DrydockLeaseQuery extends PhabricatorOffsetPagedQuery {
|
|||
$this->ids);
|
||||
}
|
||||
|
||||
$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';
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
<?php
|
||||
|
||||
final class DrydockLease extends DrydockDAO {
|
||||
final class DrydockLease extends DrydockDAO
|
||||
implements PhabricatorPolicyInterface {
|
||||
|
||||
protected $resourceID;
|
||||
protected $resourceType;
|
||||
|
@ -187,4 +188,26 @@ final class DrydockLease extends DrydockDAO {
|
|||
return $this;
|
||||
}
|
||||
|
||||
|
||||
/* -( PhabricatorPolicyInterface )----------------------------------------- */
|
||||
|
||||
|
||||
public function getCapabilities() {
|
||||
return array(
|
||||
PhabricatorPolicyCapability::CAN_VIEW,
|
||||
);
|
||||
}
|
||||
|
||||
public function getPolicy($capability) {
|
||||
return $this->getResource()->getPolicy($capability);
|
||||
}
|
||||
|
||||
public function hasAutomaticCapability($capability, PhabricatorUser $viewer) {
|
||||
return $this->getResource()->hasAutomaticCapability($capability, $viewer);
|
||||
}
|
||||
|
||||
public function describeAutomaticCapability($capability) {
|
||||
return pht('Leases inherit policies from the resources they lease.');
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -59,6 +59,7 @@ final class HarbormasterBuildArtifact extends HarbormasterDAO
|
|||
->setHref($handle->getURI());
|
||||
case self::TYPE_HOST:
|
||||
$leases = id(new DrydockLeaseQuery())
|
||||
->setViewer($viewer)
|
||||
->withIDs(array($data["drydock-lease"]))
|
||||
->execute();
|
||||
$lease = $leases[$data["drydock-lease"]];
|
||||
|
|
Loading…
Add table
Reference in a new issue