1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-09-20 09:18:48 +02: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:
epriestley 2013-12-26 10:41:36 -08:00
parent aad6b57c36
commit 6b2d480fe7
8 changed files with 66 additions and 36 deletions

View file

@ -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);

View file

@ -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');

View file

@ -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);

View file

@ -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);

View file

@ -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);

View file

@ -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) {
$lease->attachResource($resource);
} else {
unset($leases[$key]);
}
} else {
unset($leases[$key]);
}
foreach ($leases as $key => $lease) {
$resource = idx($resources, $lease->getResourceID());
if (!$resource) {
unset($leases[$key]);
continue;
}
$lease->attachResource($resource);
}
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';
}
}

View file

@ -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.');
}
}

View file

@ -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"]];