mirror of
https://we.phorge.it/source/phorge.git
synced 2025-02-22 11:39:03 +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) {
|
protected function loadLease($lease_id) {
|
||||||
|
// TODO: Get rid of this?
|
||||||
$query = id(new DrydockLeaseQuery())
|
$query = id(new DrydockLeaseQuery())
|
||||||
|
->setViewer(PhabricatorUser::getOmnipotentUser())
|
||||||
->withIDs(array($lease_id))
|
->withIDs(array($lease_id))
|
||||||
->needResources(true)
|
|
||||||
->execute();
|
->execute();
|
||||||
|
|
||||||
$lease = idx($query, $lease_id);
|
$lease = idx($query, $lease_id);
|
||||||
|
|
|
@ -13,7 +13,7 @@ final class DrydockLeaseListController extends DrydockController {
|
||||||
$pager->setOffset($request->getInt('offset'));
|
$pager->setOffset($request->getInt('offset'));
|
||||||
|
|
||||||
$leases = id(new DrydockLeaseQuery())
|
$leases = id(new DrydockLeaseQuery())
|
||||||
->needResources(true)
|
->setViewer($user)
|
||||||
->executeWithOffsetPager($pager);
|
->executeWithOffsetPager($pager);
|
||||||
|
|
||||||
$title = pht('Leases');
|
$title = pht('Leases');
|
||||||
|
|
|
@ -12,7 +12,10 @@ final class DrydockLeaseReleaseController extends DrydockController {
|
||||||
$request = $this->getRequest();
|
$request = $this->getRequest();
|
||||||
$user = $request->getUser();
|
$user = $request->getUser();
|
||||||
|
|
||||||
$lease = id(new DrydockLease())->load($this->id);
|
$lease = id(new DrydockLeaseQuery())
|
||||||
|
->setViewer($user)
|
||||||
|
->withIDs(array($this->id))
|
||||||
|
->executeOne();
|
||||||
if (!$lease) {
|
if (!$lease) {
|
||||||
return new Aphront404Response();
|
return new Aphront404Response();
|
||||||
}
|
}
|
||||||
|
@ -45,7 +48,7 @@ final class DrydockLeaseReleaseController extends DrydockController {
|
||||||
return id(new AphrontDialogResponse())->setDialog($dialog);
|
return id(new AphrontDialogResponse())->setDialog($dialog);
|
||||||
}
|
}
|
||||||
|
|
||||||
$resource = $lease->loadResource();
|
$resource = $lease->getResource();
|
||||||
$blueprint = $resource->getBlueprint();
|
$blueprint = $resource->getBlueprint();
|
||||||
$blueprint->releaseLease($resource, $lease);
|
$blueprint->releaseLease($resource, $lease);
|
||||||
|
|
||||||
|
|
|
@ -29,8 +29,8 @@ final class DrydockResourceViewController extends DrydockController {
|
||||||
$resource_uri = $this->getApplicationURI($resource_uri);
|
$resource_uri = $this->getApplicationURI($resource_uri);
|
||||||
|
|
||||||
$leases = id(new DrydockLeaseQuery())
|
$leases = id(new DrydockLeaseQuery())
|
||||||
|
->setViewer($user)
|
||||||
->withResourceIDs(array($resource->getID()))
|
->withResourceIDs(array($resource->getID()))
|
||||||
->needResources(true)
|
|
||||||
->execute();
|
->execute();
|
||||||
|
|
||||||
$lease_list = $this->buildLeaseListView($leases);
|
$lease_list = $this->buildLeaseListView($leases);
|
||||||
|
|
|
@ -25,14 +25,21 @@ final class DrydockManagementReleaseWorkflow
|
||||||
"Specify one or more lease IDs to release.");
|
"Specify one or more lease IDs to release.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$viewer = PhabricatorUser::getOmnipotentUser();
|
||||||
|
|
||||||
|
$leases = id(new DrydockLeaseQuery())
|
||||||
|
->setViewer($viewer)
|
||||||
|
->withIDs($ids)
|
||||||
|
->execute();
|
||||||
|
|
||||||
foreach ($ids as $id) {
|
foreach ($ids as $id) {
|
||||||
$lease = id(new DrydockLease())->load($id);
|
$lease = idx($leases, $id);
|
||||||
if (!$lease) {
|
if (!$lease) {
|
||||||
$console->writeErr("Lease %d does not exist!\n", $id);
|
$console->writeErr("Lease %d does not exist!\n", $id);
|
||||||
} else if ($lease->getStatus() != DrydockLeaseStatus::STATUS_ACTIVE) {
|
} else if ($lease->getStatus() != DrydockLeaseStatus::STATUS_ACTIVE) {
|
||||||
$console->writeErr("Lease %d is not 'active'!\n", $id);
|
$console->writeErr("Lease %d is not 'active'!\n", $id);
|
||||||
} else {
|
} else {
|
||||||
$resource = $lease->loadResource();
|
$resource = $lease->getResource();
|
||||||
$blueprint = $resource->getBlueprint();
|
$blueprint = $resource->getBlueprint();
|
||||||
$blueprint->releaseLease($resource, $lease);
|
$blueprint->releaseLease($resource, $lease);
|
||||||
|
|
||||||
|
|
|
@ -1,27 +1,22 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
final class DrydockLeaseQuery extends PhabricatorOffsetPagedQuery {
|
final class DrydockLeaseQuery
|
||||||
|
extends PhabricatorCursorPagedPolicyAwareQuery {
|
||||||
|
|
||||||
private $ids;
|
private $ids;
|
||||||
private $resourceIDs;
|
private $resourceIDs;
|
||||||
private $needResources;
|
|
||||||
|
|
||||||
public function withResourceIDs(array $ids) {
|
|
||||||
$this->resourceIDs = $ids;
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function withIDs(array $ids) {
|
public function withIDs(array $ids) {
|
||||||
$this->ids = $ids;
|
$this->ids = $ids;
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function needResources($need_resources) {
|
public function withResourceIDs(array $ids) {
|
||||||
$this->needResources = $need_resources;
|
$this->resourceIDs = $ids;
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function execute() {
|
public function loadPage() {
|
||||||
$table = new DrydockLease();
|
$table = new DrydockLease();
|
||||||
$conn_r = $table->establishConnection('r');
|
$conn_r = $table->establishConnection('r');
|
||||||
|
|
||||||
|
@ -33,25 +28,23 @@ final class DrydockLeaseQuery extends PhabricatorOffsetPagedQuery {
|
||||||
$this->buildOrderClause($conn_r),
|
$this->buildOrderClause($conn_r),
|
||||||
$this->buildLimitClause($conn_r));
|
$this->buildLimitClause($conn_r));
|
||||||
|
|
||||||
$leases = $table->loadAllFromArray($data);
|
return $table->loadAllFromArray($data);
|
||||||
|
}
|
||||||
|
|
||||||
if ($leases && $this->needResources) {
|
public function willFilterPage(array $leases) {
|
||||||
$resources = id(new DrydockResource())->loadAllWhere(
|
$resources = id(new DrydockResourceQuery())
|
||||||
'id IN (%Ld)',
|
->setParentQuery($this)
|
||||||
mpull($leases, 'getResourceID'));
|
->setViewer($this->getViewer())
|
||||||
|
->withIDs(mpull($leases, 'getResourceID'))
|
||||||
|
->execute();
|
||||||
|
|
||||||
foreach ($leases as $key => $lease) {
|
foreach ($leases as $key => $lease) {
|
||||||
if ($lease->getResourceID()) {
|
|
||||||
$resource = idx($resources, $lease->getResourceID());
|
$resource = idx($resources, $lease->getResourceID());
|
||||||
if ($resource) {
|
if (!$resource) {
|
||||||
|
unset($leases[$key]);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
$lease->attachResource($resource);
|
$lease->attachResource($resource);
|
||||||
} else {
|
|
||||||
unset($leases[$key]);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
unset($leases[$key]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return $leases;
|
return $leases;
|
||||||
|
@ -74,11 +67,13 @@ final class DrydockLeaseQuery extends PhabricatorOffsetPagedQuery {
|
||||||
$this->ids);
|
$this->ids);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$where[] = $this->buildPagingClause($conn_r);
|
||||||
|
|
||||||
return $this->formatWhereClause($where);
|
return $this->formatWhereClause($where);
|
||||||
}
|
}
|
||||||
|
|
||||||
private function buildOrderClause(AphrontDatabaseConnection $conn_r) {
|
public function getQueryApplicationClass() {
|
||||||
return qsprintf($conn_r, 'ORDER BY id DESC');
|
return 'PhabricatorApplicationDrydock';
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
final class DrydockLease extends DrydockDAO {
|
final class DrydockLease extends DrydockDAO
|
||||||
|
implements PhabricatorPolicyInterface {
|
||||||
|
|
||||||
protected $resourceID;
|
protected $resourceID;
|
||||||
protected $resourceType;
|
protected $resourceType;
|
||||||
|
@ -187,4 +188,26 @@ final class DrydockLease extends DrydockDAO {
|
||||||
return $this;
|
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());
|
->setHref($handle->getURI());
|
||||||
case self::TYPE_HOST:
|
case self::TYPE_HOST:
|
||||||
$leases = id(new DrydockLeaseQuery())
|
$leases = id(new DrydockLeaseQuery())
|
||||||
|
->setViewer($viewer)
|
||||||
->withIDs(array($data["drydock-lease"]))
|
->withIDs(array($data["drydock-lease"]))
|
||||||
->execute();
|
->execute();
|
||||||
$lease = $leases[$data["drydock-lease"]];
|
$lease = $leases[$data["drydock-lease"]];
|
||||||
|
|
Loading…
Add table
Reference in a new issue