From 97045077c7a33c0bdc48e0b72c4dbcff167b2057 Mon Sep 17 00:00:00 2001 From: epriestley Date: Mon, 17 Dec 2012 13:53:32 -0800 Subject: [PATCH] Show Drydock resource leases, add DrydockLeaseQuery, allow reuse of working copies Summary: Minor updates to Drydock things to make them work better. In particular, after this patch working copies are correctly allocated or reused. Test Plan: Ran "reparse.php --harbormaster ", saw reuse of working copies when unleased resources were avilable. Reviewers: btrahan Reviewed By: btrahan CC: aran Maniphest Tasks: T2015 Differential Revision: https://secure.phabricator.com/D4216 --- src/__phutil_library_map__.php | 2 + .../drydock/blueprint/DrydockBlueprint.php | 13 ++- .../blueprint/DrydockWorkingCopyBlueprint.php | 3 +- .../DrydockResourceViewController.php | 38 +++++++++ .../drydock/query/DrydockLeaseQuery.php | 80 +++++++++++++++++++ .../drydock/storage/DrydockLease.php | 2 +- 6 files changed, 133 insertions(+), 5 deletions(-) create mode 100644 src/applications/drydock/query/DrydockLeaseQuery.php diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php index ade8b24093..f8d01fc2f4 100644 --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -432,6 +432,7 @@ phutil_register_library_map(array( 'DrydockInterface' => 'applications/drydock/interface/DrydockInterface.php', 'DrydockLease' => 'applications/drydock/storage/DrydockLease.php', 'DrydockLeaseListController' => 'applications/drydock/controller/DrydockLeaseListController.php', + 'DrydockLeaseQuery' => 'applications/drydock/query/DrydockLeaseQuery.php', 'DrydockLeaseReleaseController' => 'applications/drydock/controller/DrydockLeaseReleaseController.php', 'DrydockLeaseStatus' => 'applications/drydock/constants/DrydockLeaseStatus.php', 'DrydockLeaseViewController' => 'applications/drydock/controller/DrydockLeaseViewController.php', @@ -1721,6 +1722,7 @@ phutil_register_library_map(array( 'DrydockDAO' => 'PhabricatorLiskDAO', 'DrydockLease' => 'DrydockDAO', 'DrydockLeaseListController' => 'DrydockController', + 'DrydockLeaseQuery' => 'PhabricatorOffsetPagedQuery', 'DrydockLeaseReleaseController' => 'DrydockController', 'DrydockLeaseStatus' => 'DrydockConstants', 'DrydockLeaseViewController' => 'DrydockController', diff --git a/src/applications/drydock/blueprint/DrydockBlueprint.php b/src/applications/drydock/blueprint/DrydockBlueprint.php index 8da98d682c..c00413775c 100644 --- a/src/applications/drydock/blueprint/DrydockBlueprint.php +++ b/src/applications/drydock/blueprint/DrydockBlueprint.php @@ -23,13 +23,17 @@ abstract class DrydockBlueprint { } protected function loadLease($lease_id) { - $lease = id(new DrydockLease())->load($lease_id); + $query = id(new DrydockLeaseQuery()) + ->withIDs(array($lease_id)) + ->needResources(true) + ->execute(); + + $lease = idx($query, $lease_id); + if (!$lease) { throw new Exception("No such lease '{$lease_id}'!"); } - $resource = $lease->loadResource(); - $lease->attachResource($resource); return $lease; } @@ -43,6 +47,9 @@ abstract class DrydockBlueprint { final public function filterResource( DrydockResource $resource, DrydockLease $lease) { + + $scope = $this->pushActiveScope($resource, $lease); + return $this->canAllocateLease($resource, $lease); } diff --git a/src/applications/drydock/blueprint/DrydockWorkingCopyBlueprint.php b/src/applications/drydock/blueprint/DrydockWorkingCopyBlueprint.php index fa9f0f21ca..665753275a 100644 --- a/src/applications/drydock/blueprint/DrydockWorkingCopyBlueprint.php +++ b/src/applications/drydock/blueprint/DrydockWorkingCopyBlueprint.php @@ -13,7 +13,7 @@ final class DrydockWorkingCopyBlueprint extends DrydockBlueprint { $resource_repo = $resource->getAttribute('repositoryID'); $lease_repo = $lease->getAttribute('repositoryID'); - return ($resource_repo && $lease_repo && $resource_repo == $lease_repo); + return ($resource_repo && $lease_repo && ($resource_repo == $lease_repo)); } protected function shouldAllocateLease( @@ -66,6 +66,7 @@ final class DrydockWorkingCopyBlueprint extends DrydockBlueprint { $resource->setStatus(DrydockResourceStatus::STATUS_OPEN); $resource->setAttribute('lease.host', $host_lease->getID()); $resource->setAttribute('path', $path); + $resource->setAttribute('repositoryID', $repository->getID()); $resource->save(); return $resource; diff --git a/src/applications/drydock/controller/DrydockResourceViewController.php b/src/applications/drydock/controller/DrydockResourceViewController.php index aa4005c957..93f3eaebcb 100644 --- a/src/applications/drydock/controller/DrydockResourceViewController.php +++ b/src/applications/drydock/controller/DrydockResourceViewController.php @@ -30,6 +30,13 @@ final class DrydockResourceViewController extends DrydockController { $resource_uri = 'resource/'.$resource->getID().'/'; $resource_uri = $this->getApplicationURI($resource_uri); + $leases = id(new DrydockLeaseQuery()) + ->withResourceIDs(array($resource->getID())) + ->execute(); + + $lease_list = $this->buildLeaseListView($leases); + $lease_list->setNoDataString(pht('This resource has no leases.')); + $pager = new AphrontPagerView(); $pager->setURI(new PhutilURI($resource_uri), 'offset'); $pager->setOffset($request->getInt('offset')); @@ -46,6 +53,7 @@ final class DrydockResourceViewController extends DrydockController { $header, $actions, $properties, + $lease_list, $log_table, )); @@ -106,4 +114,34 @@ final class DrydockResourceViewController extends DrydockController { return $view; } + private function buildLeaseListView(array $leases) { + assert_instances_of($leases, 'DrydockLease'); + + $user = $this->getRequest()->getUser(); + + $view = new PhabricatorObjectItemListView(); + + foreach ($leases as $lease) { + $item = id(new PhabricatorObjectItemView()) + ->setHeader($lease->getLeaseName()) + ->setHref($this->getApplicationURI('/lease/'.$lease->getID().'/')); + + $status = DrydockLeaseStatus::getNameForStatus($lease->getStatus()); + $item->addAttribute(phutil_escape_html($status)); + + $date_created = phabricator_date($lease->getDateCreated(), $user); + $item->addAttribute(pht('Created on %s', $date_created)); + + if ($lease->isActive()) { + $item->setBarColor('green'); + } else { + $item->setBarColor('red'); + } + + $view->addItem($item); + } + + return $view; + } + } diff --git a/src/applications/drydock/query/DrydockLeaseQuery.php b/src/applications/drydock/query/DrydockLeaseQuery.php new file mode 100644 index 0000000000..a7a1151092 --- /dev/null +++ b/src/applications/drydock/query/DrydockLeaseQuery.php @@ -0,0 +1,80 @@ +resourceIDs = $ids; + return $this; + } + + public function withIDs(array $ids) { + $this->ids = $ids; + return $this; + } + + public function needResources($need_resources) { + $this->needResources = $need_resources; + return $this; + } + + public function execute() { + $table = new DrydockLease(); + $conn_r = $table->establishConnection('r'); + + $data = queryfx_all( + $conn_r, + 'SELECT lease.* FROM %T lease %Q %Q %Q', + $table->getTableName(), + $this->buildWhereClause($conn_r), + $this->buildOrderClause($conn_r), + $this->buildLimitClause($conn_r)); + + $leases = $table->loadAllFromArray($data); + + if ($leases && $this->needResources) { + $resources = id(new DrydockResource())->loadAllWhere( + 'id IN (%Ld)', + mpull($leases, 'getResourceID')); + + foreach ($leases as $lease) { + if ($lease->getResourceID()) { + $resource = idx($resources, $lease->getResourceID()); + if ($resource) { + $lease->attachResource($resource); + } + } + } + } + + return $leases; + } + + private function buildWhereClause(AphrontDatabaseConnection $conn_r) { + $where = array(); + + if ($this->resourceIDs) { + $where[] = qsprintf( + $conn_r, + 'resourceID IN (%Ld)', + $this->resourceIDs); + } + + if ($this->ids) { + $where[] = qsprintf( + $conn_r, + 'id IN (%Ld)', + $this->ids); + } + + return $this->formatWhereClause($where); + } + + private function buildOrderClause(AphrontDatabaseConnection $conn_r) { + return qsprintf($conn_r, 'ORDER BY id DESC'); + } + +} diff --git a/src/applications/drydock/storage/DrydockLease.php b/src/applications/drydock/storage/DrydockLease.php index 0b523d46ee..8363dbd686 100644 --- a/src/applications/drydock/storage/DrydockLease.php +++ b/src/applications/drydock/storage/DrydockLease.php @@ -123,7 +123,7 @@ final class DrydockLease extends DrydockDAO { return $this; } - private function isActive() { + public function isActive() { switch ($this->status) { case DrydockLeaseStatus::STATUS_ACTIVE: case DrydockLeaseStatus::STATUS_ACQUIRING: